我想测试python是否可以让我运行以下代码:
listWords = []
for i in range (len(listWords)+1):
listWords.append("New word")
print ("End loop")
原因是我想创建一个尝试解决解决方案的程序,然后将新项目添加到列表中进行测试。
当我向列表中添加新项时,为什么python不更新for循环范围?
使用for循环可以解决此问题吗? (我怀疑一会儿循环会适合我的情况,但我只是很好奇)
谢谢
答案 0 :(得分:2)
遍历要同时更新的列表是不好的做法。
在您的代码中,运行循环之前已经计算了范围,因此范围将为range(1)
,然后for循环仅运行一次并停止。如果listWords
不为空,而是listWords = ['a','b']
,也可以观察到这一点,因此由于迭代器为range(3)
然后代码变为。
listWords = ['a','b']
for i in range (len(listWords)+1):
listWords.append("New word")
print ("End loop")
print(listWords)
['a', 'b', 'New word', 'New word', 'New word']
虽然循环没有这种限制,但由于len(listWords)总是在下一次迭代结束时更新,因此以下示例将继续运行
listWords = []
i = 0
while i < (len(listWords)+1):
listWords.append("New word")
i+=1
答案 1 :(得分:1)
如前所述,在迭代列表时更新列表通常不是一个好主意。但是,在这种情况下,这正是您想要执行的操作。与其在迭代列表之前 计算列表的len
(这就是为什么它从不更新的原因),而是可以直接迭代列表中的元素。
>>> lst = [1,2,3]
>>> for x in lst:
... if x < 10:
... lst.append(x*2)
...
>>> lst
[1, 2, 3, 2, 4, 6, 4, 8, 12, 8, 16, 16]
如果需要当前元素的索引(或索引和元素本身),可以使用for i, x in enumerate(lst)
来达到相同的效果。