在回答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[:]):
发布于 2018-07-31 04:12:08
由于是我的comment导致了这一点,我将添加我的后续内容:
enumerate可以看作是一个生成器,所以它将只接受一个序列(实际上是任何序列或迭代器),并只“生成”递增的索引,以从传递的序列中的每一项中产生(所以它不会仅仅使用"enumerate object"来复制或改变列表)。
对于该问题中的代码,您从未更改过要迭代的列表的长度,并且一旦运行if语句,元素的值就无关紧要了。所以这个副本是不需要的,当一个元素被删除时需要它,因为迭代器索引是与列表共享的,并且没有考虑到被删除的元素。
The Python Ninja有一个很好的例子,告诉你什么时候应该使用拷贝(或者移动到列表理解)
https://stackoverflow.com/questions/51601249
复制相似问题