1. 程式人生 > >python賦值,淺拷貝和深拷貝

python賦值,淺拷貝和深拷貝

>>> a = 1
>>> b = a
>>> a = 2
>>> a
2
>>> b
1
>>> 

你將 1 賦給 a 變數,然後拷貝 a 中的值,將它賦給變數 b。當稍
後將 a 中的值改變為 2 時,這不會影響 b 中的值。這是因為 ab
是不同的變數,儲存了不同的值。

但列表不是這樣的。當你將列表賦給一個變數時,實際上是將列表的“引用”
賦給了該變數。引用是一個值,指向某些資料。列表引用是指向一個列表的值。這
裡有一些程式碼,讓這個概念更容易理解。在互動式環境中輸入以下程式碼:

>>> list1 = ['a','b','c','d']
>>> list2 = list1
>>> list1[-1] = 'r'
>>> list1
['a', 'b', 'c', 'r']
>>> list2
['a', 'b', 'c', 'r']
#list1中的引用被複制給 list2。只有新的引用被建立並儲存在 list2中,而非新的列表。請注意,兩個引用都指向同一個列表。

在處理列表和字典時,儘管傳遞引用常常是最方便的方法,但如果函式修改了
傳入的列表或字典,你可能不希望這些變動影響原來的列表或字典。要做到這一點,
Python 提供了名為 copy 的模組,其中包含 copy()和 deepcopy()函式。第一個函式
copy.copy(),可以用來複制列表或字典這樣的可變值,而不只是複製引用。在互動
式環境中輸入以下程式碼:

>>> import copy
>>> list1 = ['a','b','c','d']
>>> list2 = copy.copy(list1)
>>> list1[-1] = 'r'
>>> list1
['a', 'b', 'c', 'r']
>>> list2
['a', 'b', 'c', 'd']
>>> list2[2] = 'g'
>>> list1
['a', 'b', 'c', 'r']
>>> list2
['a', 'b', 'g', 'd']
#如果是列表中巢狀列表,當修改內部列表時,原列表和拷貝的列表都發生的變化
>>> import copy
>>> list1 = ['a','b','c','d']
>>> list2 = ['q','w','e',list1]
>>> list3 = copy.copy(list2)
>>> list2[1] = 'M'
>>> list2
['q', 'M', 'e', ['a', 'b', 'c', 'd']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'd']]
>>> list2[-1][-1] = 'R'
>>> list2
['q', 'M', 'e', ['a', 'b', 'c', 'R']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'R']]

如果要複製的列表中包含了列表,那就使用 copy.deepcopy()函式來代替

>>> import copy
>>> 
>>> list1 = ['a','b','c','d']
>>> list2 = ['q','w','e',list1]
>>> list3 = copy.deepcopy(list2)
>>> list2[-1][-1] = 'R'
>>> list2
['q', 'w', 'e', ['a', 'b', 'c', 'R']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'd']]
>>> list1
['a', 'b', 'c', 'R']
>>> list1[2] = 'F'
>>> list2
['q', 'w', 'e', ['a', 'b', 'F', 'R']]
>>> list3
['q', 'w', 'e', ['a', 'b', 'c', 'd']]