深拷贝、浅拷贝整理
一、深拷贝&浅拷贝
Python中,进行对象赋值实际上是对象的引用。当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
注意如下3点规则:
(1)直接赋值,默认浅拷贝传递对象的引用而已,原始数据改变,被赋值的对象也会有相同的改变
(2)copy浅拷贝,没有拷贝子对象,所以原始数据改变,子对象会改变
(3)深拷贝,包含对象里面的对象的拷贝,所以原始对象的改变不会造成深拷贝里任何子元素的改变
而在对象赋值过程中,需关注是否为可变数据类型,不可变对象的值改变了,引用的地址就改变了; 可变对象的值改变,但引用的地址不变。
如:x和y的重新赋值会导致x,y指向其他地址,但是l一直指向同一个地址
def func(x,y,l):
x = y+1
l.append(0)
if "__main__" == __name__:
x=10; y=10; l=[3,2,1]
func (x,y,l)
print (x,y,l)
可看出x,y的值没有变化,而l变了,x=10,y=10,只是对“10”的同一个引用,x和y函数中的x重新赋值,指向地址id(x)已经改变,而l指向地址不变。
参考: