在Python中,是否在执行新迭代之前重新评估循环中的条件?

时间:2019-03-17 17:59:08

标签: python list for-loop pop

与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循环条件是否将重新检查下一次迭代之前提出的条件。

3 个答案:

答案 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()很容易被评估一次。