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