浅copy:
list1=['zhangsan','lisi','wangwu','zhaoliu']
list2=list1.copy() # copy之后给list2一个新的地址
print('list1pop前',id(list1))#list1pop前 1442331619456
print('list2pop前',id(list2))#list2pop前 1442331620416
print(list1,list2)
list2.pop() # 上一节说过,列表是可变类型,从list2删除一个元素,list2的地址不会改变
print('list1pop后',id(list1))#list1pop后 1442331619456
print('list2pop后',id(list2))#list2pop后 1442331620416
print(list1,list2)
对于list2的修改操作,更不会影响list1
这个类似你从D盘copy一个文件到E盘,不论你在E盘如何修改copy过去的文件,对于源文件没有任何影响。
浅copy:
可变类型:公用一个地址,修改里面的内容,但是地址不会改变
不可变类型:开始内容一样,地址一样;内容如果发生变化,地址跟着变化
如下所示:
我们修改列表里面index 3指向列表里面的一个列表
list3[2].Append(100)
list2[2].append(100)
list1[2].append(100)
列表里面的列表是可变类型,修改里面的内容,但是内存地址没有变,
因此打印出来的三个list指向的内容都存在修改后的100.
下面的例子,修改的是list列表里面的index0 ,str字符串是不可变类型,
只要修改了里面的内容,地址随着改变。
修改list3[0],那么list3[0]的地址发生了改变,list3[0]的内容跟随一起改变。
但是list1[0]和list2[0]指向 的地址并没有发生改变,因此他的内容还是张三。
这个如果还不是特别明白,可以翻看上一篇,可变和不可变
深度copy和浅copy,仔细对比修改之后的地址
import copy
list1=['张三','李四',[1,2,3,4]]
list2=copy.deepcopy(list1)
list2[2].append(100)
print('list1'+'*'*10)
for i in list1: # 采用for循环看清楚一点各个地址
print(i,id(i))
print('list2'+'-'*10)
for i in list2:
print(i,id(i))
深度copy
浅copy
深度copy的时候,list 里面的可变list地址 是不一样的;
浅copy的时候,list 里面的可变list地址 是一样的;
这样的话,深度copy的地址不一样,那么再次修改list里面的可变list,修改list2不会影响list1
同理修改list1 不会影响list2
这个一定一定要亲自去敲一下代码,打开文章,你看懂了,关闭文章你就不知道咋回事!
切勿眼高手低!敲一下去,理会一下!