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的地址相等")
想一想最後打印的是什麼?python
深拷貝,就是在對某個對象進行拷貝的時候,若是這個對象持有其餘對象的引用,在拷貝的時候會將要拷貝的對象以及引用的對象,一塊兒拷貝。面試
而淺拷貝只拷貝當前對象和持有的索引,不拷貝索引指向的對象。舉個例子說明一下,好比當前有個列表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進行淺拷貝app
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]
上面用列表這種可變數據結構舉例,再來看一下元組這種不可變結構,在進行深淺拷貝時定的現象。blog
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軟件測試、接口測試、自動化測試、面試經驗交流。感興趣能夠加軟件測試交流:718897738,還會有同行一塊兒技術交流。