0

我试图一次将列表分成 2 折(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 都指向内存中的相同位置,并且只有一个位置存储列表的实际内容。你能告诉我这里有什么问题以及如何解决我的问题吗?提前致谢!

4

2 回答 2

2

您可以通过更改行来制作列表的副本

b = a

b = a[:]
于 2013-01-19T18:26:40.120 回答
2

b = copy.deepcopy(a)使用代替复制列表b = a。它将递归地复制列表中的每个元素。但这也意味着它将比以下三个替代方案慢。

备择方案:

b = a[:]
b = 列表(一)
b = copy.copy(a)

所有替代方案都进行浅拷贝,这意味着如果原始列表的元素是对象,则它们被引用。copy并且deepcopy可以推广到任何对象,而不仅仅是列表。

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

于 2013-01-19T18:31:48.297 回答