让这段代码
x = [1, 2, 3, 4, 5, 6]
y = x
y = y + []
y
是x
的深层还是浅层副本?
答案 0 :(得分:7)
它是一个浅层副本,但在这种情况下,浅拷贝和深拷贝之间没有区别,因为列表中的整数是不可变的。实际上,它们都足够小,以至于标准Python解释器(cpython)将缓存它们(每个1
都是同一个对象),因此深层复制将具有 exact 与浅拷贝相同的内容(内容将按身份相同,而不仅仅是值)。
答案 1 :(得分:3)
此行执行列表y
的浅表副本:
y = y + []
为什么你认为它会是一个深层拷贝?
但由于整数是原子的和不可改变的,因此术语" copy"不是真的适用。对于你的例子,它无所谓。如果y
包含一些对象,是的,那么它是一个浅层副本,因为所包含的元素不会被复制。
Python模块的手册页" copy"包含了解浅版和深版之间差异所需的所有信息:https://docs.python.org/3/library/copy.html
答案 2 :(得分:1)
我根本不会打电话给你复制操作。您正在构建新列表y + []
并将其分配给名称y
。
+
运算符在列表中使用时不会复制任何内容,因此y
中的项目和x
中的项目将是相同的(就像在字面上相同的对象一样)记忆)。
无论任何列表的内容是否可变,这都是正确的,不应将可变性纳入此讨论。
>>> x = [1,2,3,4,5,6]
>>> y = x
>>> y = y +[]
>>> all(a is b for a,b in zip(y,x))
True
>>> x = [[1], [2]]
>>> y = x
>>> y = y + []
>>> all(a is b for a,b in zip(y,x))
True
在处理可变元素时唯一需要注意的是,任何可变元素的更改都将在所有容器中看到。
>>> y[0][0] = 3
>>> x
[[3], [2]]