在Python中,在执行新的迭代之前是否重新评估循环中的条件?
至于python,当涉及到for循环时,它会在重新迭代之前重新计算上界吗 假设我有以下场景:在Python中,在执行新的迭代之前是否重新评估循环中的条件?,python,list,for-loop,Python,List,For Loop,至于python,当涉及到for循环时,它会在重新迭代之前重新计算上界吗 假设我有以下场景: def remove(self,list,element): for x in range(0,len(list)): if somecondition: list.pop(x) 在执行for循环的下一次迭代之前,是否会重新评估len(list)条件?(我相信在某些语言中,如Objective-C中所做的)否则,如果弹出大量元素,则如果删除
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循环条件是否会在下一次迭代之前重新检查条件。是的,如果尝试以下操作,您会看到
超出范围的错误:
my_list = [0,1,2,3,4,5]
for x in range(0, len(my_list)):
print("Length of my_list:", len(my_list))
my_list.pop(x)
(您还应该避免使用变量名,如list
,因为它会影响Python内置的list
)文档对此很清楚:
for语句用于迭代序列(如字符串、元组或列表)或其他元素
可编辑对象:
对于“表达式列表”中的“目标列表”:“套件”
[“else”“:“suite]
表达式列表计算一次;它应该产生一个不可复制的对象。为其创建迭代器
表达式列表的结果。然后,该套件执行一次
迭代器提供的每个项,按照
迭代器
[我的重点]
因此,在您的情况下,范围(0,len(list))
将只计算一次。考虑以下代码:
i = 3
def test():
global i ;
i = i + 1
return i
for x in range(0,test()):
print( x, i )
每次调用test()
i都是递增的,因此如果每次迭代都对test()`进行求值,循环将是无止境的。然而,输出是:
0 4
1 4
2 4
3 4
显然,因此,test()
只计算了一次。这更多的是一个通用示例,而不是实际的代码。你对什么说“是”?标题中问题的答案显然是“不”。这并没有说明在每次迭代中都会重新评估范围()
——恰恰相反(因为它不是)。相反,当x
变为3时,my_列表中只剩下3个元素,因此弹出窗口超出范围。迭代固定为6,迭代因错误而终止,而不是因重新评估长度而终止。回答“是”或“否”应该避免——这个问题很容易被改变,以扭转这种感觉。更安全的做法是清楚地说明您所断言的内容。快速检查表明,如果您在迭代期间追加,则不会重新评估len(some_list)
。OTOH,如果您在列表本身上循环并附加(,对于某些列表中的x:
),那么迭代器就会混淆。在Python中,通常避免在迭代集合时对集合进行变异,除非您知道自己在做什么。您尝试了哪些调查-很容易演示。您应该阅读Python中的生成器。for循环只是try的包装,iter=next(gen)do循环,catch。这提供了一个更深入的理解。我知道,我假设范围(0,Y)也是如此,对吗?假设Y在您所在的循环中被修改,则任何表达式都是如此。范围
对象是一次性创建的,然后将对其进行迭代。