我以为我理解Python如何处理可变的副本,但我遇到了以下行为。
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的纯副本以避免发生这种情况?
发布于 2014-12-25 18:48:06
当您确实在复制一个副本时,它是一个浅表副本:mylist_copy包含对原始x的引用。
若要进行深度复制,请使用copy.deepcopy()。
发布于 2014-12-25 18:55:05
这并不是因为生成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]]https://stackoverflow.com/questions/27649829
复制相似问题