首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >这是深拷贝还是浅拷贝?

这是深拷贝还是浅拷贝?
EN

Stack Overflow用户
提问于 2016-04-05 19:02:08
回答 3查看 236关注 0票数 1

让这段代码

代码语言:javascript
运行
复制
x = [1, 2, 3, 4, 5, 6]
y = x
y = y + []

yx的深拷贝还是浅拷贝?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-04-05 19:07:36

它是一个浅拷贝,但在本例中,浅拷贝和深拷贝没有区别,因为列表中的整数是不可变的。实际上,它们都足够小,以至于标准的Python解释器(cpython)会缓存它们(每个1都是同一个对象),因此深拷贝的内容将与浅层副本完全相同(内容在身份上是相同的,而不仅仅是值)。

票数 7
EN

Stack Overflow用户

发布于 2016-04-05 19:06:17

这一行执行列表y的浅拷贝。

代码语言:javascript
运行
复制
y = y + []

你为什么认为这会是一份很深的拷贝?

但是由于ints是原子的和不可变的,所以“复制”一词并不真正适用。就你的例子来说,这根本不重要。如果y包含一些对象,是的,那么它是一个浅拷贝,因为包含的元素没有被复制。

Python模块“拷贝”的手册页包含了理解浅拷贝和深拷贝之间区别所需的所有信息:https://docs.python.org/3/library/copy.html

票数 3
EN

Stack Overflow用户

发布于 2016-04-05 19:11:48

我根本不认为你在做的是复制操作。您正在构建一个新的列表y + [],并将其分配给名称y

+运算符在列表中使用它时不会复制任何内容,因此y中的项和x中的项将是相同的(就像内存中相同的对象中的一样)。

这是正确的,无论任何列表的内容都是可变的,不应将可更改性纳入讨论。

代码语言:javascript
运行
复制
>>> 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

在处理可变元素时,唯一需要注意的是,对任何可变元素的更改都会在所有容器中看到,这些容器都包含对这些元素的引用。

代码语言:javascript
运行
复制
>>> y[0][0] = 3
>>> x
[[3], [2]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36434901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档