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

问题描述 投票:3回答:3

至于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个元素,则会出现越界错误,最后一次迭代会尝试访问list[len(list)-1]

我自己试图对此进行调查,但每次结果都很混乱。

编辑:我相信我的问题与标记为重复的问题不同,因为我的问题是关于循环继续下一次迭代的条件,它可以很容易地添加元素而不是删除元素。

为了澄清,我的问题是询问for循环条件是否会重新检查下一次迭代之前提出的条件。

python list for-loop pop
3个回答
5
投票

关于The for statement的文档很清楚:

for语句用于迭代序列的元素(例如字符串,元组或列表)或其他可迭代对象:

“expression_list”中的for_stmt :: =“for”target_list“:”suite [“else”“:”suite“

表达式列表评估一次;它应该产生一个可迭代的对象。为expression_list的结果创建一个迭代器。然后,按迭代器返回的顺序,对迭代器提供的每个项执行一次该套件。

[强调我的]

所以,在你的情况下,range(0,len(list))只会被评估一次。


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。)


0
投票

请考虑以下代码:

i = 3

def test():
  global i ;
  i = i + 1
  return i

for x in range(0,test()):
  print( x, i )

每次test() is callediis incremented, so the loop woul be endless iftest()`都会在每次迭代时进行评估。然而输出是:

0 4
1 4
2 4
3 4

显然,test()被评估一次。

© www.soinside.com 2019 - 2024. All rights reserved.