首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复制python列表

复制python列表
EN

Stack Overflow用户
提问于 2013-06-14 04:20:57
回答 3查看 218关注 0票数 9

就在我以为我已经理解了Python列表是如何工作的时候…

代码语言:javascript
复制
>>> a = [1,2,3]
>>> b = a[:]
>>> b
[1,2,3]
>>> b[1]=100
>>> b
[1,100,3]
>>> a
[1,2,3]

到现在为止还好。我用a的内容初始化b,这样b就指向一个不同的对象。因此,b中的更改不会影响a。

现在来看另一个例子:

代码语言:javascript
复制
>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:][:]
>>> b
[[1,2,3],[4,5,6],[7,8,9]]
>>> b[1][1] = 100
>>> b
[[1,2,3],[4,100,6],[7,8,9]]
>>> a
[[1,2,3],[4,100,6],[7,8,9]]

为什么这一次b的变化会影响a?与前面的示例有什么不同?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-14 04:23:45

切片操作x[:]进行浅层复制。这意味着,外部列表是不同的,但包含完全相同的元素。假设a = [[1]]

代码语言:javascript
复制
b = a[:] # is the same as:
b = [x for x in a]

>>> a[0] is b[0]
True

双重切片([:][:])的作用仅此而已--同样:

代码语言:javascript
复制
b = a[:][:] # is the same as:
b = [y for y in [x for x in a]]

>>> a[0] is b[0]
True

浅拷贝的浅拷贝就是浅拷贝。

因此,b仍然是a的浅表副本-这些列表是不同的对象,但它们包含相同的元素。然后在b中修改内部列表,但在a中是相同的列表。

可以使用b=[x[:] for x in a]进行2级浅层复制。它以同样的方式扩展到n级复制。

顺便说一句,术语“浅层复制”对于任何类或容器都具有相同的含义。

如果你想要真正的深度拷贝,你应该考虑使用deep copy

票数 11
EN

Stack Overflow用户

发布于 2013-06-14 04:27:55

silcing制作了一个浅层拷贝。但内部对象仍未复制,因此如果它们是可变的,并且您将对其进行修改,则它们将被修改;)在这两个列表中,您将看到以下内容

使用列表理解

代码语言:javascript
复制
b = [i[:] for i in a]

或copy.deepcopy()

代码语言:javascript
复制
import copy
b = copy.deepcopy(a)
票数 4
EN

Stack Overflow用户

发布于 2013-06-14 04:29:13

试试这个:

代码语言:javascript
复制
In [38]: import copy

In [39]: a = [[1,2,3],[4,5,6],[7,8,9]]

In [40]: b=copy.deepcopy(a)

In [41]: b[1][1] = 100

In [42]: a
Out[42]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

In [43]: b
Out[43]: [[1, 2, 3], [4, 100, 6], [7, 8, 9]]

阅读更多@ http://docs.python.org/2/library/copy.html

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17096298

复制
相关文章

相似问题

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