【发布时间】:2019-03-17 17:59:07
【问题描述】:
对于python来说,对于for循环,是否会在重新迭代之前重新计算上界?
假设我有以下场景:
def remove(self,list,element):
for x in range(0,len(list)):
if somecondition:
list.pop(x)
在执行for 循环的下一次迭代之前,是否会重新评估len(list) 条件? (正如我相信在某些语言中所做的那样,例如 Objective-C),否则,如果弹出多个元素,如果删除了 1 个元素,则会出现越界错误,并且最后一次迭代将尝试访问 list[len(list)-1]。
我曾尝试自己对此进行调查,但每次结果都很混乱。
编辑:我相信我的问题与标记为重复的问题不同,因为我的问题是关于循环继续下一次迭代的条件,它可以很容易地添加一个元素而不是删除元素。
为了澄清,我的问题是 for 循环条件是否会重新检查下一次迭代之前提出的条件。
【问题讨论】:
-
快速检查表明,如果您在迭代期间追加,
len(some_list)将不会被重新评估。 OTOH,如果您遍历列表本身并附加(for x in some_list:),那么迭代器就会混淆。除非您知道自己在做什么,否则在 Python 中通常会避免在迭代集合时对其进行变异。 -
您尝试了哪些调查 - 很容易证明。
-
您应该阅读有关 python 中的生成器的信息。 for 循环只是 try、iter=next(gen) do 循环、catch 的包装器。这提供了更深入的理解