python - 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的工作原理吗?
解决方案
他们都被评估一次。问题是它myList
是一个可变对象,并且列表迭代器不会复制列表,这意味着只要您继续在循环内附加项目,迭代器将始终有一个新值来产生。
range(len(myList))
评估为range(3)
。这个范围对象不知道列表,当它改变大小时,不会改变范围(也不可能,因为范围对象在 Python 中是不可变的)。
如果您希望循环遍历您计划进行变异的列表,更好的选择是制作它的副本:
for item in myList[:]:
myList.append(item)
副本没有发生变异,因此它只会运行有限的次数。
正如 Ghost Ops 所提到的,将列表元素附加到自身的最佳方法是myList.extend(myList)
.
推荐阅读
- jquery - 选中时禁用动态创建的复选框
- android - 数据绑定在android中是如何工作的?
- azure - 无法通过 Windows 应用程序读取 Azure Key Vault 的密钥
- asp.net - 使用 IIS 8 和 VB.Net 进行路由时出现错误 404
- python-3.x - 最常出现的邻居 (nltk)
- reactjs - eslint 不对不存在的类方法发出警告
- javascript - Hyperapp中输入元素的输入事件的去抖动动作
- react-native - React Native 中的 Redux Persist 和 Update Packager
- ansible - Ansible 无法安装 Windows INF 驱动程序
- javascript - 重新加载页面后 Ajax 值保持不变