我以为我理解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
的纯副本以便不会发生这种情况?
答案 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]]