今天学习的时候发现了一个之前没有注意的细节
引用变量赋值问题
n个引用变量指向同一个对象,通过一个变量修改对象内部数据,另一个变量看到的是修改之后的数值
a = [12,3,4]
b = a
a[0] = 1
print(b)
>>> [1, 3, 4]
是因为两个变量指向了同一个内存地址,修改一个,另一个也会改变。
有一个易混淆的情况:
a = [12,3,4]
b = a
a = [2,1,6]
print(b)
>>> [12, 3, 4]
这个时候,b的值并没有随着a的改变而改变,是因为这个时候,a开辟了新的地址,而b依然指向旧的地址,这两种情况有点类似于copy与deepcopy。
还有在自定义函数的时候,容易发生的混淆:
a = [2,1,6]
def function(obj):
obj = [1,2,3]
function(a)
print(a)
>>> [2, 1, 6]
def function(obj):
obj = [1,2,3]
return obj
function(a)
>>> [1, 2, 3]
第一种情况,无return时,函数执行结束,内存地址将被释放销毁,所以a的值并没有保存。
第二种情况,有return时,函数执行结束,内存地址被保留,所以a的内存指向改变。
在使用的时候注意区分就好啦。