python測試開發面試之深淺拷貝

先來道題熱熱身

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,還會有同行一塊兒技術交流。

相關文章
相關標籤/搜索