Python-从列表中删除项目时出现奇怪的结果

我有这段代码:

numbers = range(1, 50)

for i in numbers:

if i < 20:

numbers.remove(i)

print(numbers)

但我得到的结果是:

[2、4、6、8、10、12、14、16、18、20、21、22、23、24、25、26、27、28、29、30、31、32、33、34、35 ,36、37、38、39、40、41、42、43、44、45、46、47、48、49]

当然,我期望低于20的数字不会出现在结果中,我假设我对删除操作做错了什么。

回答:

在遍历列表时,你正在修改它。这意味着第一次遍历循环时,i==1,因此1从列表中删除。然后for循环转到列表中的第二项,不是2,而是3!然后从列表中删除,然后for循环转到列表中的第三项,现在是5。等等。也许这样更容易想象,用^表示i的值:

[1, 2, 3, 4, 5, 6...]

^

最初是列表的状态;然后删除1,然后循环转到列表中的第二项:

[2, 3, 4, 5, 6...]

^

[2, 4, 5, 6...]

^

等等。

在迭代列表时,没有很好的方法来更改列表的长度。你可以做的最好的事情是这样的:

numbers = [n for n in numbers if n >= 20]

或这样,就地更改(parens中的内容是一个生成器表达式,在切片分配之前隐式转换为元组):

numbers[:] = (n for in in numbers if n >= 20)

如果要在删除n之前对n执行操作,可以尝试的一种技巧是:

for i, n in enumerate(numbers):

if n < 20 :

print "do something"

numbers[i] = None

numbers = [n for n in numbers if n is not None]

以上是 Python-从列表中删除项目时出现奇怪的结果 的全部内容, 来源链接: utcz.com/qa/408169.html

回到顶部