【发布时间】:2018-07-30 19:45:55
【问题描述】:
在回复this question 时,我遇到了一些我在 Python 中从未想过的事情(由用户指出)。
基本上,我已经知道(这里有一个有趣的thread),我必须在 Python 中对列表进行变异时进行迭代,以避免出现奇怪的行为。
现在,我的问题是,使用 enumerate 是否可以解决这个问题?
test_list = [1,2,3,4]
for index,item in enumerate(test_list):
if item == 1:
test_list.pop(index)
这段代码会被认为是安全的还是我应该使用,
for index,item in enumerate(test_list[:]):
【问题讨论】:
-
但是什么会更安全呢?无论如何,您正在修改原始列表,对吗?只要您在循环期间不从列表中删除项目,就可以不创建列表的副本。
-
@Shan 我想我一直都错了。我认为在迭代列表时修改列表在 python 中是被禁止的,并且可能导致奇怪的输出。为了记录,我认为我的第二个例子会更安全。
-
改变列表的大小或项目排序可能会导致意外行为。更改单个项目的值可能是无害的。
-
@scharette 复制总是安全的——除非分配一个新列表并复制所有元素会导致
MemoryError或者花费很长时间以至于您的算法不再有用,当然。问题是不复制是否“足够安全”,这是一个比它应该的更棘手的问题。 -
是的,我明白了。我的问题实际上是关于改变一个列表。为了这个问题,我创建了一个过于简单的例子。例如,我是否应该更改
test_list.pop(index)的声明。那会更合适。