数组切片好像是在做深拷贝?

Array slicing seems like it's making a deep copy?

python 中的切片应该是浅拷贝。但是,当我 运行 以下内容时:

cur = [[0] * (2) for _ in xrange(2)]
cur2 = [row[:] for row in cur]
cur2[0][0] = "foo"
print(cur)
print(cur2)

我得到:

[[0, 0], [0, 0]] # cur
[['foo', 0], [0, 0]] # cur2

这让它看起来像是一个深拷贝。

我有两个问题: 1)这里发生了什么?这是深拷贝还是浅拷贝? 2) 这种语法如何使它比 copy.deepcopy 快得多?例如,它与 python 管理内存的方式有关吗?

您正在制作内部列表(即行)的浅拷贝,如果内部列表只是列表,这实际上与外部列表的深拷贝相同int 个对象。

您实际上已经为整数列表的列表的特殊情况实现了深度复制功能。

使用 copy.deepcopy 会比较慢,因为该函数必须调查和缓存对象的所有 ID,包括 int 对象。您的代码片段没有这样做,但在这种特殊情况下,这无关紧要(注意,小的 int 对象缓存在解释器级别,它们本质上是单例,无论如何, int 对象是不可变的,所以根本不需要复制它们。

如果您想确切了解通用深拷贝中涉及的内容,请点击此处 link to the copy module source code

我觉得你对浅拷贝和深拷贝有误解

浅拷贝复制集合的结构(本质上是内存位置),而深拷贝复制内存中的所有内容(如实际数据)。

您在这里所做的是从原始二维列表中形成每个子列表副本的新列表 - 从而产生一个全新的列表,与原始列表没有关系 - 因此您完成了 深度复制 .

相反,如果您要执行:cur[:],您将只复制包含对内部列表的相同引用的外部列表 - 因此 浅拷贝.

在您的情况下,由于所有内存位置都不同,因此更改一个元素不会影响原始元素,但如果您只是 cur[:],那么内部行将引用内存中的相同位置,因此更改任一列表中的元素都会影响另一个列表。