今日知识点:深浅copy
#有一个列表如下 list1=['xiaozai','mengwuji', [1,2]]
# 二者分隔不开,list改list2也跟着该,因为指向的就是同一个地址 list2=list1 #这不叫copy list1[0]='XIAOZAI' #改变list1的值,list2的值也会跟着变 print(list2) #输出['XIAOZAI', 'mengwuji', [1, 2]]
需求:
1、拷贝一下原列表产生一个新的列表
2、想让两个列表完全独立开,并且针对的是改操作的独立而不是读操作
如何copy列表
- 浅copy:是把原列表第一层的内存地址不加区分完全copy一份给新列表
list1=['xiaozai','mengwuji', [1,2]] list3=list1.copy() print(list3) #输出 ['xiaozai', 'mengwuji', [1, 2]] print(id(list1)) #输出 2374779323328(内存地址) print(id(list3)) #输出 2374779334976(内存地址)
实验1:
对于不可变类型的赋值,都是产生了新值,让原列表的索引指向新的
内存地址,并不会影响新列表
#改变list1的值看list3是否会改变 list1[0] = 'DAZAI' print(list3) #输出 ['xiaozai', 'mengwuji', [1, 2]] #list3的值并没有改变
实验2:
但对于可变类型,我们可以改变可变类型中包含的值,但内存地址不变
即原列表的索引指向仍然指向原来的内存地址,于是新列表也跟着一起受影响,如下
list1=['xiaozai','mengwuji', [1,2]] list3=list1.copy() list1[0] = "HELLO" list1[2][0]=111 list1[2][1]=222 print(list1) #输出 ['HELLO', 'mengwuji', [111, 222]] print(list3) #输出 ['xiaozai', 'mengwuji', [111, 222]]
感兴趣的同学可以分别打印列表中每个值所对应的内存地址,会有更深刻的理解,这里就不详细演示了
- 综合实验1和实验2可以得出,要想copy得到的新列表与原列表的改操作完全独立开
必须有一种可以区分开可变类型与不可变类型的copy机制,这就是深copy
深copy
import copy list1=['xiaozai','mengwuji', [1,2]] list3=copy.deepcopy(list1) print(id(list1)) #输出 2012667241472 print(id(list3)) #输出 2012667234112 print(list3) #输出 ['xiaozai', 'mengwuji', [1, 2]] # 不可变 不可变 可变 print(id(list1[0]),id(list1[1]),id(list1[2])) #输出 2012665075184 2012665075248 2012667073664 print(id(list3[0]),id(list3[1]),id(list3[2])) #输出 2012665075184 2012665075248 2012667234944 print("----------------------------") print(id(list1[2][0]),id(list1[2][1])) #输出 140724545914544 140724545914576 print(id(list3[2][0]),id(list3[2][1])) #输出 140724545914544 140724545914576 list1[0]='FIRST' list1[1]='SECOND' list1[2][0]=111 list1[2][1]=222 print(list1) #输出 ['FIRST', 'SECOND', [111, 222]] print(list3) #输出 ['xiaozai', 'mengwuji', [1, 2]]
现在懂了深浅拷贝了吧?