这是y = y + []深拷贝还是浅拷贝?

时间:2016-04-05 19:02:09

标签: python

让这段代码

x = [1, 2, 3, 4, 5, 6]
y = x
y = y + []

yx的深层还是浅层副本?

3 个答案:

答案 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]]