首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改列表副本,修改原件

修改列表副本,修改原件
EN

Stack Overflow用户
提问于 2014-12-25 18:46:24
回答 2查看 38关注 0票数 2

我以为我理解Python如何处理可变的副本,但我遇到了以下行为。

代码语言:javascript
复制
x = [i for i in xrange(5)]
mylist = [x, x]

mylist_copy = mylist[:]

mylist_copy[0].pop()

mylist

Out : [[0, 1, 2, 3], [0, 1, 2, 3]] 

因此,尽管只对mylist进行了更改,但似乎对mylist_copy进行了更改。如何创建mylist的纯副本以避免发生这种情况?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-25 18:48:06

当您确实在复制一个副本时,它是一个浅表副本:mylist_copy包含对原始x的引用。

若要进行深度复制,请使用copy.deepcopy()

票数 3
EN

Stack Overflow用户

发布于 2014-12-25 18:55:05

这并不是因为生成mylist_copy时有任何复制错误,而是因为mylist由两个相同的元素组成。

代码语言:javascript
复制
mylist = [x,x] adds two references to the same object (`x`).

因此,mylist[0].pop()将具有相同的结果:

代码语言:javascript
复制
In [70]: x = [i for i in range(5)]

In [71]: mylist = [x,x]

In [72]: mylist
Out[72]: [[0, 1, 2, 3, 4], [0, 1, 2, 3, 4]]

In [73]: mylist[0].pop()
Out[73]: 4

In [74]: mylist
Out[74]: [[0, 1, 2, 3], [0, 1, 2, 3]]

这里有一个绕过这个问题的方法:

代码语言:javascript
复制
In [80]: x = [i for i in range(5)]

In [81]: mylist = [x, x[:]]

In [82]: mylist_copy = mylist[:]

In [83]: mylist_copy[0].pop()
Out[83]: 4

In [84]: mylist
Out[84]: [[0, 1, 2, 3], [0, 1, 2, 3, 4]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27649829

复制
相关文章

相似问题

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