1.賦值: 只是復制了新對象的引用,不會開辟新的內存空間。
2.淺拷貝: 創建新對象,其內容是原對象的引用。
淺拷貝有三種形式:切片操作,工廠函數,copy模塊中的copy函數。
如: lst = [1,2,3,[4,5]]
切片操作:lst1 = lst[:] 或者 lst1 = [each for each in lst]
工廠函數:lst1 = list(lst)
copy函數:lst1 = copy.copy(lst)
淺拷貝之所以稱為淺拷貝,是它僅僅只拷貝了一層,在lst中有一個嵌套的list[4,5],如果我們修改了它,情況就不一樣了。
3.深拷貝:只有一種形式,copy模塊中的deepcopy函數。
和淺拷貝對應,深拷貝拷貝了對象的所有元素,包括多層嵌套的元素。
深拷貝出來的對象是一個全新的對象,不再與原來的對象有任何關聯。
>>> import copy >>> a = [1,2,3,4,['a','b']] #定義一個列表a >>> b = a #賦值 >>> c = copy.copy(a) #淺拷貝 >>> d = copy.deepcopy(a) #深拷貝 >>> a.append(5) >>> print(a) [1, 2, 3, 4, ['a', 'b'], 5] #a添加一個元素5 >>> print(b) [1, 2, 3, 4, ['a', 'b'], 5] #b跟着添加一個元素5 >>> print(c) [1, 2, 3, 4, ['a', 'b']] #c保持不變 >>> print(d) [1, 2, 3, 4, ['a', 'b']] #d保持不變 >>> a[4].append('c') >>> print(a) [1, 2, 3, 4, ['a', 'b', 'c'], 5] #a中的list(即a[4])添加一個元素c >>> print(b) [1, 2, 3, 4, ['a', 'b', 'c'], 5] #b跟着添加一個元素c >>> print(c) [1, 2, 3, 4, ['a', 'b', 'c']] #c跟着添加一個元素c >>> print(d) [1, 2, 3, 4, ['a', 'b']] #d保持不變 #說明如下: #1.外層添加元素時, 淺拷貝c不會隨原列表a變化而變化;內層list添加元素時,淺拷貝c才會變化。 #2.無論原列表a如何變化,深拷貝d都保持不變。 #3.賦值對象隨着原列表一起變化