了解 Python 中的浅拷贝
Understanding the shallow copy in Python
我有两组演示浅拷贝的代码,但我无法解释代码行为不同的原因。
第一组代码:
import copy
cv1 = [1,2,3]
cv2 = copy.copy(cv1)
print(cv1)
print(cv2)
cv2[0] = 0
cv1[1] = 1
print(cv1)
print(cv2)
输出:
[1, 2, 3]
[1, 2, 3]
[1, 1, 3]
[0, 2, 3]
第二组代码:
import copy
a = [ [1, 2, 3], [4, 5, 6] ]
b = copy.copy(a)
print(a)
print(b)
a[1][2] = 25
b[0][0] = 98
print(a)
print(b)
输出:
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
[[98, 2, 3], [4, 5, 25]]
[[98, 2, 3], [4, 5, 25]]
以我的理解,这两个代码应该做完全相同的事情。为什么每个代码段中的第二组print
语句之后,cv1
和cv2
的内容不同,而a
和b
的内容相同.?也许这是我这边的一个非常基本的错误,我是 Python 的新手,但我似乎无法弄清楚。感谢您的帮助。
这与copy library you imported有关。
copy.copy(x)
Return a shallow copy of x.
A shallow copy constructs a new compound object and then (to the extent possible) inserts > references into it to the objects found in the original.
所以在第一种情况下,副本正在创建一个新的 int 对象列表,而在第二种情况下,它正在创建一个引用对象列表。
虽然在第二种情况下,列表 a 和 b 不同,但它们包含相同的列表。这就是为什么更改其中一个列表将同时编辑两个列表的原因。
为了使两种情况相同,您需要使用 copy.deepcopy 函数。
我有两组演示浅拷贝的代码,但我无法解释代码行为不同的原因。
第一组代码:
import copy
cv1 = [1,2,3]
cv2 = copy.copy(cv1)
print(cv1)
print(cv2)
cv2[0] = 0
cv1[1] = 1
print(cv1)
print(cv2)
输出:
[1, 2, 3]
[1, 2, 3]
[1, 1, 3]
[0, 2, 3]
第二组代码:
import copy
a = [ [1, 2, 3], [4, 5, 6] ]
b = copy.copy(a)
print(a)
print(b)
a[1][2] = 25
b[0][0] = 98
print(a)
print(b)
输出:
[[1, 2, 3], [4, 5, 6]]
[[1, 2, 3], [4, 5, 6]]
[[98, 2, 3], [4, 5, 25]]
[[98, 2, 3], [4, 5, 25]]
以我的理解,这两个代码应该做完全相同的事情。为什么每个代码段中的第二组print
语句之后,cv1
和cv2
的内容不同,而a
和b
的内容相同.?也许这是我这边的一个非常基本的错误,我是 Python 的新手,但我似乎无法弄清楚。感谢您的帮助。
这与copy library you imported有关。
copy.copy(x)
Return a shallow copy of x.
A shallow copy constructs a new compound object and then (to the extent possible) inserts > references into it to the objects found in the original.
所以在第一种情况下,副本正在创建一个新的 int 对象列表,而在第二种情况下,它正在创建一个引用对象列表。
虽然在第二种情况下,列表 a 和 b 不同,但它们包含相同的列表。这就是为什么更改其中一个列表将同时编辑两个列表的原因。
为了使两种情况相同,您需要使用 copy.deepcopy 函数。