首页 > 解决方案 > Python append element with for ... in 会导致无限循环,但不会 for ... range

问题描述

我有一个列表,我想将相同的元素附加到自身。

myList = [1,2,3]

使用 for...range 执行此操作是可以的:

for i in range(len(myList)):
    myList.append(myList[i])

print(myList) # [1,2,3,1,2,3]

但是使用 for...in 会导致无限循环:

for i in myList:
    myList.append(i)

# infinite loop

这是为什么?我的猜测是in range(len(myList))只评估一次,但in myList每次迭代都会重新评估?这就是python的工作原理吗?

标签: python

解决方案


他们都被评估一次。问题是它myList是一个可变对象,并且列表迭代器不会复制列表,这意味着只要您继续在循环内附加项目,迭代器将始终有一个新值来产生。

range(len(myList))评估为range(3)。这个范围对象不知道列表,当它改变大小时,不会改变范围(也不可能,因为范围对象在 Python 中是不可变的)。

如果您希望循环遍历您计划进行变异的列表,更好的选择是制作它的副本:

for item in myList[:]:
    myList.append(item)

副本没有发生变异,因此它只会运行有限的次数。

正如 Ghost Ops 所提到的,将列表元素附加到自身的最佳方法是myList.extend(myList).


推荐阅读