问题的起因是面试时被问到
list1=[1,2,3,4]
list2=list1
list1.append(5)
list2的值?
感觉考的是深拷贝和浅拷贝的知识,特此记录
list1=[1,2,3,4,5,]
list2=list1
list1.append(10)
print("list1:",list1)
print("list2:",list2)
直接赋值:其实就是对象的引用;
list1 和list2就是同一块地址的两个引用。
深拷贝和浅拷贝的区别:
深拷贝和浅拷贝都是对象的拷贝,都会生成一个看起来相同的对象,但是他们的本质区别是拷贝出来的对象地址是否和原对象一样,即是地址的复制还是值的复制的区别。
list1=[1,2,3,4,5,{"szs":1},6,7]
list2=list1
list3=list1.copy()
list4=copy.deepcopy(list1)
list1[5]["kd"]=2
print("list1:",list1)
print("list2:",list2)
print("list3:",list3)
print("list4:",list4)
print("id(list1):",id(list1))
print("id(list2):",id(list2))
print("id(list3):",id(list3))
print("id(list4):",id(list4))
print("id(list1[5]):",id(list1[5]))
print("id(list3[5]):",id(list3[5]))
print("id(list4[5]):",id(list4[5]))
可以看出list1和list2都指向同一块地址,
浅拷贝list3和list1是俩个独立的对象,但是其子对象还是指向同一对象
深拷贝list4完全拷贝了父对象和其子对象,两者是完全独立的。
赋值: python中,对象的赋值就是简单的对象引用
浅拷贝: 浅拷贝会创建对象,其内容不是对原对象本身的引用,而是对原对象内第一层对象的引用
深拷贝:
深拷贝的实现由copy模块中的deepcopy()函数。深拷贝拷贝了对象的所有元素,包括多层嵌套的元素。
注意:
对于非容器类型,如数字,字符,以及其他的原子类型,没有拷贝一说,产生的都是原对象的引用;