1. 程式人生 > >Python基礎之深淺copy

Python基礎之深淺copy

deepcopy 示例 3.2 一致性 code 結果 epc 完全 pri

1. 賦值

lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = lst1

lst1[0] = 11
print(lst1)         #[11, 2, 3, [‘a‘, ‘b‘, ‘c‘]]
print(lst2)         #[11, 2, 3, [‘a‘, ‘b‘, ‘c‘]]

lst1[3][0] = "d"
print(lst1)         #[11, 2, 3, [‘d‘, ‘b‘, ‘c‘]]
print(lst2)         #[11, 2, 3, [‘d‘, ‘b‘, ‘c‘]]

對於賦值運算來說,lst1和lst2指向的是同一個內存地址,所以它們是一樣的。

2. 淺copy

2.1 示例1

lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = lst1.copy()
print(lst1, id(lst1))
print(lst2, id(lst2))

執行結果為:

[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 48285736
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 48285776

2.2 示例二

lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = lst1.copy()
lst1[0] = 11
print(lst1, id(lst1))
print(lst2, id(lst2))

執行結果為:

[11, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 48285736
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 48285776

2.3 示例三

lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = lst1.copy()
lst1[3][0] = "d"
print(lst1, id(lst1))
print(lst2, id(lst2))

執行結果為:

[1, 2, 3, [‘d‘, ‘b‘, ‘c‘]] 48285536
[1, 2, 3, [‘d‘, ‘b‘, ‘c‘]] 48285736

2.4 總結

對於淺copy來所,第一層創建的是新的內存地址,而從第二層開始,指向的都是同一個內存地址。

所以,對於第二層以及更深的層數來說,保持一致性。

3. 深拷貝(deepcopy)

3.1 示例一

import copy
lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = copy.deepcopy(lst1)

print(lst1, id(lst1))
print(lst2, id(lst2))

執行結果為:

[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 54249392
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 54249992

3.2 示例二

import copy
lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = copy.deepcopy(lst1)

lst1[0] = 11
print(lst1, id(lst1))
print(lst2, id(lst2))

執行結果為:

[11, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 48678832
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 48679432

3.3 示例三

import copy
lst1 = [1, 2, 3, ["a", "b", "c"]]
lst2 = copy.deepcopy(lst1)

lst1[3][0] = "d"
print(lst1, id(lst1))
print(lst2, id(lst2))

執行結果為:

[1, 2, 3, [‘d‘, ‘b‘, ‘c‘]] 46516144
[1, 2, 3, [‘a‘, ‘b‘, ‘c‘]] 46516744

3.4 總結

對於deepcopy來說,兩個是完全獨立的,改變任意一個的任何元素(無論多少層),另一個絕對不改變。

Python基礎之深淺copy