深拷贝和浅拷贝实例理解加深以及细节

深拷贝和浅拷贝实例理解加深

列表传递地址需特别注意(理解深浅拷贝的前提条件)

要熟悉列表内存图,才能更好理解下面这个情况

list01 = ["张无忌","赵敏"]  
#list01中存放的是列表["张无忌","赵敏"]的地址
list02 = list01  
#同理这是list01把存放的列表["张无忌","赵敏"]的地址交给list02
list01[0] = "无忌"  
#这段通过list01改变了列表的内容,而list02存放的内容是这个列表的地址,这个列表内容变了,所以print(list02[0])同样也会变
print(list02[0])  
#因为list01和list02存放的都是这个列表的地址,并不是这个列表的内容,所以列表本身内容变,则都变。

无忌

切片赋值

但是因为切片动作会复制生成一个相同的列表,所以利用切片赋列表时,情况又不一样。

list03 = ["张无忌","赵敏"]  #list01中存放的是列表["张无忌","赵敏"]的地址
list04 = list03[:]  #因为进行了切片操作,此时内存中生成了一个和list03一样的列表,并把它的地址赋给了list04
list03[0] = "无忌"  #这段通过list01改变了列表的内容,而list02存放的内容是这个列表的地址,这个列表内容变了,所以print(list04[0])同样也会变
print(list04[0])  #因为是另外复制的列表,所以当list03内容变化时,list04并不会变。

张无忌

浅拷贝

就切片的情况又有不同的地方,假如列表中有元素也是列表时,因为外层列表存放的内层列表的内存地址,所以即便切片复制了新的列表,新的列表保存的地址也是不变的。

list05 = [800,[900,500]]  
#list05中存放的是列表的地址
list06 = list05[:]  
#因为进行了切片操作,此时内存中生成了一个和list05一样的列表,并把它的地址赋给了list06,但是复制生成的新列表之中
#保存的地址因为是一样的,所以指向的内容也是一样的。
list05[1][0] = 1000  
#这段通过list05改变了列表中的列表[900,500]的内容,list06虽然是复制的,但相同的内存地址指向的也是[900,500]的地址
#[900,500]变成了[1000,500],所以print(list06[1][0])同样也会变
print(list06[1][0])  
#画一下内存图就能清晰地分辨与上一种情况的差别。

1000

list02 = list01[:] 这种复制列表的方式叫做浅拷贝,只复制第一层,深层的变量不复制,例如列表中的列表就不进行复制。
list02 = list01.copy() 也是浅拷贝,功能与list02 = list01[:]相同。

深拷贝

#深拷贝
import copy

list07 = [800,[900,500]]
list08 = copy.deepcopy(list07)
list07[1][0] = 1000
print(list08[1][0])

900

猜你喜欢

转载自blog.csdn.net/zx980414k/article/details/108839989