让这段代码
x = [1, 2, 3, 4, 5, 6]
y = x
y = y + []
y
是x
的深拷贝还是浅拷贝?
发布于 2016-04-05 19:07:36
它是一个浅拷贝,但在本例中,浅拷贝和深拷贝没有区别,因为列表中的整数是不可变的。实际上,它们都足够小,以至于标准的Python解释器(cpython)会缓存它们(每个1
都是同一个对象),因此深拷贝的内容将与浅层副本完全相同(内容在身份上是相同的,而不仅仅是值)。
发布于 2016-04-05 19:06:17
这一行执行列表y
的浅拷贝。
y = y + []
你为什么认为这会是一份很深的拷贝?
但是由于ints是原子的和不可变的,所以“复制”一词并不真正适用。就你的例子来说,这根本不重要。如果y
包含一些对象,是的,那么它是一个浅拷贝,因为包含的元素没有被复制。
Python模块“拷贝”的手册页包含了理解浅拷贝和深拷贝之间区别所需的所有信息:https://docs.python.org/3/library/copy.html
发布于 2016-04-05 19:11:48
我根本不认为你在做的是复制操作。您正在构建一个新的列表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]]
https://stackoverflow.com/questions/36434901
复制相似问题