前言 在說深淺拷貝之前,我們要明白以下原因是怎麼產生的: 為什麼a的數值就會變呢,我只是在b中添加了一個數值15,怎麼a中也會添加一個15呢?原來python中所採用的的引用的方法,就是說a變數只是指向[13,14]這一個地址,當b = a時,並沒有重新開闢一個新的地址,而是將b指向[13,14]這 ...
前言
在說深淺拷貝之前,我們要明白以下原因是怎麼產生的:
為什麼a的數值就會變呢,我只是在b中添加了一個數值15,怎麼a中也會添加一個15呢?原來python中所採用的的引用的方法,就是說a變數只是指向[13,14]這一個地址,當b = a時,並沒有重新開闢一個新的地址,而是將b指向[13,14]這個地址,所以當執行b.append(15)時,就是在原地址的基礎改的,即牽一發而動全身。下圖可以更加清晰的表達出來。
深拷貝
何為深拷貝,重新在複製一份,新的這一份數值與舊的這一份一樣,但是地址已經不一樣了,他們已經沒有的任何關係了,如下代碼所示:
In [4]: a = [11,12] #將[11,12]賦值給a In [5]: b = a #將a賦值給b In [6]: id(a) #獲取a的地址 Out[6]: 2321940139848 In [7]: id(b) #獲取b的地址,並且與a的地址相同 Out[7]: 2321940139848 In [8]: import copy #深拷貝需要通過copy這個模塊來實現 In [9]: c = copy.deepcopy(a) #將a深拷貝給c In [10]: id(a) #獲取a的地址 Out[10]: 2321940139848 In [11]: id(c) #獲取b的地址,發現與a的截然不同,已完成了深拷貝 Out[11]: 2321937374344 In [12]: a #列印出a的值 Out[12]: [11, 12] In [13]: c #列印出b的值 Out[13]: [11, 12] In [14]: a.append(33) #在a中新添加一個33的新值 In [15]: a #列印出a的值,發現其值已經改變 Out[15]: [11, 12, 33] In [16]: c #列印出c的值,發現其值沒有改變,說明這是深拷貝 Out[16]: [11, 12] In [17]:
In [32]: a = [11,22] In [33]: b = [33,44] In [34]: c = [a,b] In [35]: d = copy.deepcopy(c) In [36]: id(c) Out[36]: 2321946266696 In [37]: id(d) Out[37]: 2321943989128 In [38]: id(c[0]) Out[38]: 2321948894472 In [39]: id(d[0]) Out[39]: 2321946155976 In [40]: a.append(55) In [41]: c Out[41]: [[11, 22, 55], [33, 44]] In [42]: d Out[42]: [[11, 22], [33, 44]]
淺拷貝
即只拷貝第一層,深入就不拷貝,此之謂淺拷貝,如下類代碼說話
In [18]: #當一個變數=xxxx的時候,可以理解為這個變數指向的xxxx In [20]: # 完成淺拷貝copy.copy In [21]: # 完成深拷貝copy.deepcopy In [22]: a = [11,22] #給a賦值 In [23]: b = [33,44] #給b賦值 In [24]: c = [a,b] #給c賦值 In [25]: d = c #d指向c的指向 In [26]: e = copy.copy(c) #拷貝c給d In [27]: id(c) #列印出c的地址 Out[27]: 2321944795080 In [28]: id(e) #列印e的地址,與c不同,說明完成了第一層的拷貝 Out[28]: 2321938538568 In [29]: id(e[1]) #列印出e的第二層地址 Out[29]: 2321938541448 In [30]: id(c[1]) #列印出c的第二層地址,與e 的第二層地址相同,說明沒有拷貝成功 Out[30]: 2321938541448 In [31]:
註意註意
當copy.copy進行淺拷貝和copy.deepcopy進行深拷貝的時候,遇到第一層為不可變數據類型並且裡面都不可變類型,則無法進行拷貝,兩個還是同時指向同一個。但是第一層為不可變類型,第二層為可變類型,copy.copy不進行拷貝,copy.deepcopy進行拷貝
In [44]: a = [11,22] In [45]: b = a In [46]: id(a) Out[46]: 2321947428616 In [47]: id(b) Out[47]: 2321947428616 In [48]: c = copy.copy(a) In [49]: id(c) Out[49]: 2321934839368 In [50]: a = (11,22) In [51]: b = copy.copy(a) In [52]: id(a) Out[52]: 2321938558344 In [53]: id(b) Out[53]: 2321938558344