python里对于列表list的赋值,深拷贝,浅拷贝都有很大的区别
-
赋值
p1 = ["A", "B", "C"] p2 = p1 print(p2) # 输出['A', 'B', 'C'] p1[0] = 1 print(p2) # 输出[1, 'B', 'C']
这里先对p1赋值,然后用对p2赋值,修改p1后,p2也会跟着发生变化,因此pyhon里列表的赋值其实可以看成C里的数组,赋值过去的只是一个地址,将p1,p2都指向同一个内存块,因此改变一个会引起连锁.
-
浅拷贝
import copy p1 = ["A", "B", "C"] # 三种浅copy方式 p2 = p1.copy() p2 = p1[:] p2 = copy.copy(p1) print(p2) # 输出为['A', 'B', 'C'] p1[0] = 1 print(p2) # 输出为['A', 'B', 'C']
-
浅拷贝,即将列表的"第一层"全部拷贝过去,但是第二层还是一个地址,指向相同的内存块,典型例子如下
p1 = ["A", ["a", "b"], "C"] p2 = p1.copy print(p2) # 输出['A', ['a', 'b'], 'C'] p1[1][0] = 1 print(p2) # 输出['A', [1, 'b'], 'C']
这里修改p1的第一层,不会影响p2,但是修改第二层就会影响,所以称之为浅拷贝(只真正拷贝了一层,再往下还是指向同一块内存)
-
深拷贝
import copy p1 = ["A", ["a", "b", "c"], "C"] p2 = copy.deepcopy(p1) print(p2) # 输出['A', ['a', 'b', 'c'], 'C'] p1[1][0] = 1 print(p2) # 输出['A', ['a', 'b', 'c'], 'C']
看完以上的,深拷贝就简单多了,可以看成对列表完整的拷贝,拷贝完成后两个列表互不干涉.最后附上菜鸟笔记里的图.