python賦值,淺拷貝和深拷貝

2021-08-31 21:32:31 字數 2368 閱讀 2383

>>> 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']]

淺拷貝 深拷貝和淺賦值 深賦值

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,新的物件會在記憶體中開闢乙個新的記憶體空間,並且只拷...