Python 使用 for ... in 附加元素会导致无限循环,但使用 for ... range 不会导致无限循环[重复]

2024-01-02

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

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 的工作原理吗?


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

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

如果你想循环遍历你计划改变的列表,更好的选择是复制它:

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 使用 for ... in 附加元素会导致无限循环,但使用 for ... range 不会导致无限循环[重复] 的相关文章

随机推荐