修改列表副本,修改原件

时间:2014-12-25 18:46:25

标签: python-2.7

我以为我理解Python如何处理mutable的副本,但我发现了以下行为。

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的纯副本以便不会发生这种情况?

2 个答案:

答案 0 :(得分:3)

虽然您确实在制作副本,但它是浅层副本mylist_copy包含对原始x的引用。

要制作深层副本,请使用copy.deepcopy()

答案 1 :(得分:1)

这不是因为在制作mylist_copy时出现任何复制错误,而是因为mylist由两个相同的元素组成。

mylist = [x,x] adds two references to the same object (`x`).

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

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

这是绕过这个问题的一种方法:

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