Python - 在for循环中删除列表的元素并重新分配列表

时间:2013-01-19 18:24:44

标签: python python-2.7

我试图将列表分成两次(10次)并在每个分区上执行操作。我想在列表上以1:9的比例一次执行此操作。这意味着我将列表分为10倍,在第一次迭代中,我将在第一次折叠上执行操作,剩下的9次,在第二次迭代中,我将在第二次折叠上执行它,剩下的9次,依此类推。现在,为了做到这一点,我决定保留原始列表的副本并将其中一个折叠分配给临时变量,从列表中删除它并将剩余部分作为第二个分区。然后将列表副本重新分配给它以进行下一次迭代。但是,似乎副本和原始文件在for循环中始终相同,因此我得到索引超出范围错误。这是一个简单的问题示例:

>>> a = ['a', 'b', 'c', 'd', 'e', 'f']
>>> b = a
>>> b
['a', 'b', 'c', 'd', 'e', 'f']
>>> for i in xrange (len(a)):
    del (b [i])
    b = a

Traceback (most recent call last):
  File "<pyshell#22>", line 2, in <module>
    del (b [i])
IndexError: list assignment index out of range

似乎a和b都指向内存中的相同位置,并且只有一个位置存储列表的实际内容。你能告诉我这里有什么问题以及如何解决我的问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:2)

您可以通过更改行

来制作列表的副本
b = a

b = a[:]

答案 1 :(得分:2)

使用b = copy.deepcopy(a)而不是b = a复制列表。它将递归复制列表的每个元素。但这也意味着它将比以下三种选择更慢。

备选方案:

b = a[:]
b = list(a)
b = copy.copy(a)

所有替代方案都执行浅层复制,这意味着如果原始列表的元素是对象,则会引用它们。 copydeepcopy可以推广到任何对象,而不仅仅是列表。

=的问题在于它创建了对同一对象的新引用。这是pythontutor中代码的可视化 - http://goo.gl/3UN3T