Time will tell.

1、先來道題熱熱身
a = ('a', 'b','c') c = copy.copy(a) d = copy.deepcopy(a) if c == d: print("c和d的值相等") if id(c) == id(d): print("c和d的地址相等")
想想最后列印的是什么?
.
.
2、什么是深拷貝和淺拷貝
深拷貝,就是在對某個物件進行拷貝的時候,如果這個物件持有其他物件的參考,在拷貝的時候會將要拷貝的物件以及參考的物件,一起拷貝,
而淺拷貝只拷貝當前物件和持有的索引,不拷貝索引指向的物件,舉個例子說明一下,比如當前有個串列a = [1,2,3], b = [3,4,a],[3,4,a]物件持有了[1,2,3]物件的參考,在對b進行深拷貝的時候,會將a物件一起拷貝一份,而淺拷貝的時候則不會,
a = [1,2,3]
b = [4,5,6,a]
對b進行淺拷貝
c = copy.copy(b)
這個時候對a物件進行修改,會影響c
a.append(8)
c
[4, 5, 6, [1, 2, 3, 8]]
對b進行深拷貝之后,再對a進行修改,則不會影響到d
d = copy.deepcopy(b) d [4, 5, 6, [1, 2, 3, 8]] a.append(66) d [4, 5, 6, [1, 2, 3, 8]
3、當深淺拷貝遇到可變與不可變物件時會發生什么
上面用串列這種可變資料結構舉例,再來看一下元組這種不可變結構,在進行深淺拷貝時定的現象,
a = (1,2,3) b = copy.copy(a) c = copy.deepcopy(a) print(id(a)) print(id(b)) print(id(c))
輸出:
4502776896
4502776896
4502776896
從結果中發現,a、b、c的記憶體地址大都是一樣,所以在對不可變物件進行拷貝的時候,無論是淺拷貝還是深拷貝,都沒有重新在記憶體中開辟新的地址,都只是對原物件增加了一個參考,
那如果不可變物件匯總包含有對可變物件的參考又會是怎么樣呢?
a1 = [1,2,3] a = (1,2,3, a1) b = copy.copy(a) c = copy.deepcopy(a) print(id(a)) print(id(b)) print(id(c))
輸出:
4502730288
4502730288
4503232240
b是淺拷貝生成的物件和原物件a的記憶體地址是一樣對的,c是深拷貝生成的物件,發現記憶體地址和原物件a的地址是不一樣的,
也就是說如果不可變物件中持有了可變物件的參考,在進行深拷貝的時候會在記憶體中開辟新的地址存放物件,
回到文章開頭提出的問題,是對不可變物件進行拷貝,而且不可變物件中并沒有持有可變物件的參考,所以兩個print陳述句都會執行,

絮叨
如果你處于想學Python自動化或正在學習Python自動化中,Python自動化的教程不少了,但不一定是最新的,說不定你學的是別人一年前就學過的內容,干貨分享一波!2020最新的Python教程,獲取方式,加175317069私信Q群管理即可免費獲取,
喜歡的話,歡迎【評論】、【點贊】、【關注】禮貌三連
Time will tell.(時間會證明一切)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/140498.html
標籤:其他
