与python一样,在for循环中,是否会在重新迭代之前重新评估上限?
说我有以下情况:
def remove(self,list,element):
for x in range(0,len(list)):
if somecondition:
list.pop(x)
在执行len(list)
循环的下一次迭代之前,将重新评估for
条件吗? (我相信,这是在某些语言(例如Objective-C)中所做的)否则,如果弹出了多个元素,那么如果说1个元素被删除,则将出现越界错误,并且最后一次迭代将尝试访问{{1} }。
我尝试自己进行调查,但是每次都混淆了结果。
编辑:我认为我的问题与标记为重复的问题有所不同,因为我的问题是关于循环继续进行下一次迭代的条件,因此可以轻松添加一个元素而不是删除元素。
为澄清起见,我的问题询问for循环条件是否将重新检查下一次迭代之前提出的条件。
答案 0 :(得分:5)
关于The for statement的文档对此很清楚:
for语句用于遍历序列的元素(例如字符串,元组或列表)或其他 可迭代对象:
for_stmt :: =“ for” target_list“ in” expression_list“:”套件 [“ else”“:”套件]
表达式列表被评估一次;它应该产生一个可迭代的对象。为创建一个迭代器 expression_list的结果。该套件然后执行一次 迭代器提供的每个项目,按迭代器返回的顺序 迭代器。
[我的重点]
因此,在您的情况下,range(0,len(list))
仅被评估一次。
答案 1 :(得分:1)
是的,如果尝试以下操作,您会看到out of range
错误:
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
中内置的变量。)
答案 2 :(得分:0)
考虑以下代码:
i = 3
def test():
global i ;
i = i + 1
return i
for x in range(0,test()):
print( x, i )
每次迭代时都评估test() is called
i is incremented, so the loop woul be endless if
test()`。但是输出是:
0 4
1 4
2 4
3 4
因此,test()
很容易被评估一次。