python學習(六):python中賦值、淺拷貝、深拷貝的區別
阿新 • • 發佈:2018-12-03
存在賦值、淺拷貝、深拷貝問題的資料型別是對組合物件來說,所謂的組合物件就是包含了其它物件的物件,如列表,類例項。
其他的單個物件則不存在這個問題。
可變物件: list, dict.
不可變物件有: int, string, float, tuple.
-
直接賦值:其實就是物件的引用(別名)。
-
淺拷貝(copy):拷貝父物件,不會拷貝物件的內部的子物件。
-
深拷貝(deepcopy): copy 模組的 deepcopy 方法,完全拷貝了父物件及其子物件。
字典淺拷貝例項
例項
>>>a = {1: [1,2,3]} >>> b = a.copy() >>> a, b ({1: [1, 2, 3]}, {1: [1, 2, 3]}) >>> a[1].append(4) >>> a, b ({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
深度拷貝需要引入 copy 模組:
例項
>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
解析
1、b = a: 賦值引用,a 和 b 都指向同一個物件。
2、b = a.copy(): 淺拷貝, a 和 b 是一個獨立的物件,但他們的子物件還是指向統一物件(是引用)。
b = copy.deepcopy(a): 深度拷貝, a 和 b 完全拷貝了父物件及其子物件,兩者是完全獨立的。
更多例項
以下例項是使用 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.deepcopy(a) #物件拷貝,深拷貝 a.append(5) #修改物件a a[4].append('c') #修改物件a中的['a', 'b']陣列物件 print( 'a = ', a ) print( 'b = ', b ) print( 'c = ', c ) print( 'd = ', d )
以上例項執行輸出結果為:
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])
也就是說 對於組合物件的a b
當b=a b就是 a的一個引用,a怎麼變化,b就會怎麼變化。
當b=a.copy() 淺拷貝 只拷貝了父物件,沒有拷貝子物件 a新增新的子物件的話,b不會變 但是修改原本的子物件 b會變
當b=a.deepcopy() 深拷貝,a怎麼變,b都不會再變了。