目标

  • 变量的引用
  • 可变和不可变类型
  • 局部变量和全局变量

1、变量的引用

1)引用的概念

python中数据是不可变的,将数据赋给变量仅仅是让变量拥有了对数据的引用。

函数id:查看变量对应的数据所在地址

def test(num):
    print("-" * 50)
    print("%d 在函数内的内存地址是%x" % (num, id(num)))
    result = 100
    print("返回值%d 在内存中的地址是%x" % (result, id(result)))
    print("-" * 50)
    return result
a = test(7)
print("返回值%d 在内存中的地址是%x" % (a, id(a)))

输出结果

--------------------------------------------------
7 在函数内的内存地址是7fff25577d00
返回值100 在内存中的地址是7fff255788a0
--------------------------------------------------
返回值100 在内存中的地址是7fff255788a0

Python 中,函数的实参/返回值 都是靠引用来传递来的

2)、可变类型与不可变类型

不可变类型: 内存中的数据不可以修改

数字类型:int、bool、float、complex
元组类型:tuple
字符串类型: str

可变类型: 内存中的数据可以被修改

字典: dict
列表: list

字典中的key只能使用不可变类型

2、局部变量和全局变量

1)函数内修改全局变量

函数内部不可以直接修改全局变量的值。
如果需要修改,需要加上global关键字

num = 2
def test():
    global num
    num = 5
print(num)
test()
print(num)
  • 为了保证所有的函数都能够正确使用到全局变量,应该将全局变量定义在其他函数的上方

    2) 开发时的全局变量

开发时全局变量需要加上特定记号,以避免混淆
如:g_ 或者gl_ 的前缀

函数的参数

问题1:在函数内部,针对参数使用赋值语句,会不会影响调用函数时传递的实参变量(的值)?—
—不会!

  • 无论传递的参数是可变 还是不可变 只要针对参数使用赋值语句,会在函数内部 修改局部变量的引用*不会影响到外部变量的引用

问题2:如果传递的参数是可变类型,在函数内部,使用方法 修改了数据的内容,同样会影响到外部的数据

    def mutable(num_list):
    # num_list = [1, 2, 3]
    num_list.extend([1, 2, 3])
    print(num_list)
    gl_list = [6, 7, 8]
    mutable(gl_list)
    print(gl_list)
示例——`+=`* 在`python` 中,列表变量调用`+=` 本质上是在执行列表变量的`extend` 方法,不会修改变量的引用