淺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
這個一定一定要親自去敲一下代碼,打開文章,你看懂了,關閉文章你就不知道咋回事!
切勿眼高手低!敲一下去,理會一下!