1. 程式人生 > >Python 中的淺拷貝和深拷貝

Python 中的淺拷貝和深拷貝

ont () ebe ans 深拷貝 函數 port epc com

1. 列表和字典,直接賦值,都是淺拷貝,即賦值雙方指向同一地址,因為 Python 對可變對象按引用傳遞。

>>> a = [1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> a[0] = apple
>>> a
[apple, 2, 3]
>>> b
[apple, 2, 3]
>>> 
>>> 
>>> dic = {a: apple, b: banbana
} >>> dic2 = dic >>> dic2 {a: apple, b: banbana} >>> dic[b] = blueberry >>> dic {a: apple, b: blueberry} >>> dic2 {a: apple, b: blueberry}

2. 對非嵌套的列表,使用完全切片[:], 工廠函數 list(),或者 copy.copy() 都是深拷貝。

>>> a = [1, 2, 3]
>>> b = list(a) >>> c = a[:] >>> import copy >>> d = copy.copy(a) >>> >>> a[0] = apple >>> a [apple, 2, 3] >>> b [1, 2, 3] >>> c [1, 2, 3] >>> d [1, 2, 3]

3. 對於非嵌套的字典,使用工廠函數 dict(),或者 copy.copy() 都是深拷貝。

>>> dic = {a: apple, b: banana}
>>> dic2 = dict(dic)
>>> import copy
>>> dic3 = copy.copy(dic)
>>> 
>>> dic[b] = blueberry
>>> dic
{a: apple, b: blueberry}
>>> dic2
{a: apple, b: banana}
>>> dic3
{a: apple, b: banana}

4. 對於嵌套的列表,嵌套的字典,只能使用 copy.deepcopy() 實現深拷貝。

>>> import copy
>>> 
>>> a = [1, 2, [apple]]
>>> b = copy.deepcopy(a)
>>> a[2][0] = watermelon
>>> a
[1, 2, [watermelon]]
>>> b
[1, 2, [apple]]
>>> 
>>> 
>>> dic = {a: apple, b: {b1: banana, b2: blueberry}}
>>> dic2 = copy.deepcopy(dic)
>>> dic[b][b1] = bukeneng
>>> dic
{a: apple, b: {b1: bukeneng, b2: blueberry}}
>>> dic2
{a: apple, b: {b1: banana, b2: blueberry}}

5. 對於嵌套可變對象的元組,只有 copy.deepcopy() 實現深拷貝。

>>> import copy
>>>
>>> t = (1, 2, [apple]) >>> t2 = t >>> t3 = tuple(t) >>> t4 = copy.copy(t) >>> t5 = copy.deepcopy(t) >>> >>> t[2][0] = watermelon >>> t (1, 2, [watermelon]) >>> t2 (1, 2, [watermelon]) >>> t3 (1, 2, [watermelon]) >>> t4 (1, 2, [watermelon]) >>> t5 (1, 2, [apple])

完。

Python 中的淺拷貝和深拷貝