Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,在执行新的迭代之前是否重新评估循环中的条件?_Python_List_For Loop - Fatal编程技术网

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

在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中所做的)否则,如果弹出大量元素,则如果删除

至于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循环条件是否会在下一次迭代之前重新检查条件。

是的,如果尝试以下操作,您会看到
超出范围的错误:

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在您所在的循环中被修改,则任何表达式都是如此。
范围
对象是一次性创建的,然后将对其进行迭代。