了解 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语句之后,cv1cv2的内容不同,而ab的内容相同.?也许这是我这边的一个非常基本的错误,我是 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 函数。