python 深拷貝與淺拷貝

2021-09-02 02:19:37 字數 2799 閱讀 6464

當乙個變數=***的時候,約定為: 指向位址的過程

如果copy.copy()拷貝的是元組,那麼它不會進行淺拷貝,僅僅是指向

因為元組是不可變資料型別,那麼意味著資料一定不能修改,因此用copy.copy的

時候它會自動判斷,是指向。

如果,用copy.copy() copy.deepcopy()對乙個全部是不可變型別的資料進行

資料拷貝,那麼它們的結果相同,都是指向。

如果拷貝的是乙個擁有可變型別的資料,那麼deepcopy依然是深拷貝,而copy.copy還是指向。

淺拷貝:copy.copy()

深拷貝:copy.deepcopy()

in [38]: import copy

in [39]: a = [11,22]

in [40]: b = [33,44]

in [41]: c = [a,b]

in [42]: c

out[42]: [[11, 22], [33, 44]]

in [43]: d = copy.copy(c) #d淺拷貝

in [44]: id(c)

out[44]: 140233732341960

in [45]: id(d)

out[45]: 140233713050888 #列表為可變資料型別,淺拷貝建立新位址,裡面的列表仍然為指向

in [46]: id(c[0])

out[46]: 140233732292488

in [47]: id(d[0])

out[47]: 140233732292488 #僅僅是指向

in [48]: id(a)

out[48]: 140233732292488

in [49]: e = copy.deepcopy(c) #e為深拷貝

in [50]: id(e)

out[50]: 140233732321800 #深拷貝,建立乙個新位址並且指向

in [51]: id(c)

out[51]: 140233732341960

in [52]: id(c[1])

out[52]: 140233731307720

in [53]: id(e[1])

out[53]: 140233713173832

in [54]: id(d[1])

out[54]: 140233731307720 #內部也建立新位址

in [55]: a = [11,22]		#a,b均為列表

in [56]: b = [33,44]

in [57]: c = [a,b] #c為列表巢狀列表

in [58]: d = copy.copy(c) #d淺拷貝

in [59]: e = copy.deepcopy(c) #e深拷貝

in [60]: id(c)

out[60]: 140233732324104

in [61]: id(d)

out[61]: 140233740633608

in [62]: id(e)

out[62]: 140233732090888

in [64]: c

out[64]: [[11, 22], [33, 44], [55, 66]]

in [65]: d

out[65]: [[11, 22], [33, 44]] #de不變

in [66]: e

out[66]: [[11, 22], [33, 44]]

in [73]: a = [11,22]	#a,b是列表

in [74]: b = [33,44]

in [75]: c = (a,b) #c是元組,不可變資料型別

in [76]: c

out[76]: ([11, 22], [33, 44])

in [77]: d = copy.copy(c) #d為淺拷貝

in [78]: id(c)

out[78]: 140233732322440

in [79]: id(d)

out[79]: 140233732322440 #d僅僅為指向

in [80]: e = copy.deepcopy(c) #e為深拷貝

in [81]: id(e)

out[81]: 140233713145672 #e建立了新位址

in [82]: id(c)

out[82]: 140233732322440

in [83]: id(c[1])

out[83]: 140233713122504

in [84]: id(e[1])

out[84]: 140233731173640 #e中索引值為1的元素新建位址

in [85]: id(d[1])

out[85]: 140233713122504 #d中索引值為1的元素仍然為指向

in [87]: c

out[87]: ([11, 22, 55], [33, 44])

in [88]: e

out[88]: ([11, 22], [33, 44])

列表

[,] 

淺拷貝 裡面的不變 外面的變

深拷貝 裡面的變 外面的變

元組

(,)        	淺拷貝 深拷貝 不變

(,) 淺拷貝 外面不變 裡面不變

深拷貝 外面的變 裡面的變

Python 淺拷貝與深拷貝

淺拷貝 構造方法或切片 做的是淺拷貝 即拷貝了最外層容器,副本中的元素是原容器中元素的引用 在 python 中,通過乙個物件向另外乙個物件賦值,實際僅僅是賦值了物件的引用,而非建立乙個物件並賦值。那如何真正拷貝物件呢?我們看一下兩種不同的拷貝方式。先從乙個示例看起 anndy anndy age ...

Python 淺拷貝與深拷貝

以下例項是使用 copy 模組的 copy.copy 淺拷貝 和 copy.deepcopy usr bin python coding utf 8 import copy a 1,2,3,4,a b 原始物件 b a 賦值,傳物件的引用 c copy.copy a 物件拷貝,淺拷貝 d copy....

Python深拷貝與淺拷貝

python有個內建的copy的模組專門用於處理深拷貝與淺拷貝,很實用,用起來也很方便,能為我們省去不少麻煩,不用自己再寫深拷貝或者淺拷貝物件的方法了。賦值,淺拷貝,深拷貝只針對可變變數,如list,dict,tuple python中賦值都是進行記憶體位址的傳遞 淺拷貝 copy,copy 只會賦...