>>> a = 1
>>> b = a
>>> a = 2
>>> a
2>>> b
1>>>
你將1賦給a變數,然後拷貝a中的值,將它賦給變數b。當稍
後將a中的值改變為2時,這不會影響b中的值。這是因為a和b
是不同的變數,儲存了不同的值。
但列表不是這樣的。當你將列表賦給乙個變數時,實際上是將列表的「引用」
賦給了該變數。引用是乙個值,指向某些資料。列表引用是指向乙個列表的值。這
裡有一些**,讓這個概念更容易理解。在互動式環境中輸入以下**:
>>> 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']]
淺拷貝 深拷貝和淺賦值 深賦值
include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...
Python 賦值 淺拷貝 深拷貝
賦值 a b,只拷貝了物件的引用,沒有拷貝內容。兩個物件的id一樣 淺拷貝 copy.copy 構造乙個新的復合物件,然後將子物件引用插入到原始物件的副本中。深拷貝 copy.deepcopy 構造乙個新的復合物件,然後遞迴地將子物件副本插入原始物件的副本。給個栗子 從這個栗子可以看出,對c進行修改...
python賦值 淺拷貝 深拷貝
視覺化 首先了解知識點 可變 list,dict 和不可變 string,int,tuple 淺拷貝 對於string int來說沒有意義,因為它們資料就一層,對於tuple由於是不可變型別所以新的物件會指向原來的物件位址,對於list和dict,新的物件會在記憶體中開闢乙個新的記憶體空間,並且只拷...