python里面的引用
1 对象及其引用
python中,引用是用命名空间来实现的,命名空间维护了变量和对象之间的引用关系。
1 myInt = 27 2 yourInt = myInt 3 4 #change the value of yourInt 5 yourInt = yourInt + 5
改变值的过程中,命名空间快照如下:
、
如上图所示,每个不可变对象的操作都将创建指向新对象的引用。
对于可变对象,情况会不一样。
1 list1 = [1, 2, 3] 2 list2 = list1 3 4 #list1 append a new element 5 list1.append(4) 6 7 print(list1) 8 print(list2)
对list1的改变已经反映到了list2中,list1、list2均引用同一个对象。
2 深复制与浅复制
1 >>> list1 = [1, 2, 3] 2 >>> list2 = [4, 5, 6] 3 >>> list1.append(list2) #将列表2添加到列表1中 4 >>> list1 5 [1, 2, 3, [4, 5, 6]] 6 >>> list3 = list2 #给这个列表另一个名字 7 >>> list3 8 [4, 5, 6] 9 >>> list2 is list3 10 True 11 >>> list3[2] = 66 #重新赋值 12 >>> list3 13 [4, 5, 66] #列表3变化,正常 14 >>> list2 15 [4, 5, 66] #列表2变化 ,正常 16 >>> list1 17 [1, 2, 3, [4, 5, 66]] #列表1也变化了,神马情况
具体情况如下图:
如上,将list2加入list1时,只是复制了应用,没有复制对象本身的情况,称为浅拷贝。要复制内容,而不是简单的复制引用,称为深拷贝。
在copy模块中,有deepcopy函数,在需要时,强制进行深拷贝。
编程技巧: 对引用可变对象的变量进行操作,可能会改变对象本身或者创建一个新的对象。对引用不可变对象的变量进行操作,
只会创建新的对象