Python 3.x 理解Python中的浅拷贝

Python 3.x 理解Python中的浅拷贝,python-3.x,list,copy,shallow-copy,Python 3.x,List,Copy,Shallow Copy,我有两组代码演示了浅复制,但我无法解释为什么代码的行为不同 第一组代码: 导入副本 cv1=[1,2,3] cv2=复制。复制(cv1) 打印(cv1) 打印(cv2) cv2[0]=0 cv1[1]=1 打印(cv1) 打印(cv2) 输出: [1,2,3] [1, 2, 3] [1, 1, 3] [0, 2, 3] 第二组代码: 导入副本 a=[[1,2,3],[4,5,6]] b=复制。复制(a) 印刷品(a) 印刷品(b) a[1][2]=25 b[0][0]=98 印刷品(a)

我有两组代码演示了浅复制,但我无法解释为什么代码的行为不同

第一组代码:

导入副本
cv1=[1,2,3]
cv2=复制。复制(cv1)
打印(cv1)
打印(cv2)
cv2[0]=0
cv1[1]=1
打印(cv1)
打印(cv2)
输出:

[1,2,3]
[1, 2, 3]
[1, 1, 3]
[0, 2, 3] 
第二组代码:

导入副本
a=[[1,2,3],[4,5,6]]
b=复制。复制(a)
印刷品(a)
印刷品(b)
a[1][2]=25
b[0][0]=98
印刷品(a)
印刷品(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还不熟悉,但我似乎无法理解这一点。非常感谢您的帮助。

这与您的工作有关

拷贝,拷贝(x)

返回x的浅拷贝

浅复制构造一个新的复合对象,然后(尽可能)向其中插入>引用,指向在原始副本中找到的对象

因此,在第一种情况下,副本正在创建一个新的int对象列表,而在第二种情况下,副本正在创建一个引用对象列表

在第二种情况下,列表a和b是不同的,但它们内部包含相同的列表。这就是为什么更改其中一个列表会编辑两个列表的原因


要使这两种情况相同,您需要使用该函数。

因为您的第二个示例是一个包含列表引用的列表。你复制的是参考资料,而不是它背后的数据。请参阅关于如何处理它的答案