如果变量在for循环语句中该怎么办?



我只是想知道如果一个变量是for循环(或while循环)语句会发生什么。该变量是否只在语句第一次执行时计算?
例如:

arr = [2, 3, 4]
for i in range(len(arr)):
arr.append(5)

是。试一试:

>>> arr = [2, 3, 4]
>>>
>>> for i in range(len(arr)):
...     arr.append(5)
...
>>> arr
[2, 3, 4, 5, 5, 5]

如你所见,循环有3次迭代,因为这是循环开始时len(arr)的值。

这就是通常不鼓励在迭代列表(或任何其他可迭代对象)时修改它的确切原因;结果可能并不总是直观的,因为迭代器是在循环开始时设置的,修改列表可能会导致它以意想不到的方式运行(跳过项等)。

是否该变量仅在语句第一次执行时被求值执行?

是的,如果我正确理解你的问题,for循环头中的表达式只计算一次。您可以通过创建自己的函数来验证这一点,该函数打印一条消息,然后返回数组的长度。

def my_fun(my_list):
print("Inside my function.")
return len(my_list)
arr = [2, 3, 4]
for i in range(my_fun(arr)):
arr.append(5)
print(arr)

输出:

Inside my function.
[2, 3, 4, 5, 5, 5]

可以看到,消息只打印一次,因此range(my_fun(arr))必须只计算一次。

这里的代码相当于:

arr = [2, 3, 4]
r = range(len(arr))
for i in r:
arr.append(5)
print(arr)

对range函数的调用生成了一个range (https://docs.python.org/3/library/stdtypes.html#typesseq-range)类型的新对象。因此,通过for循环的迭代是在对象r上,而不是对象arr上。因此,在循环arr中的修改对循环本身没有影响,因为这个修改是在对象r上的。

另一方面,如果我们尝试下面的代码:
arr = [2, 3, 4]
for i in arr:
arr.append(5)
if len(arr) > 15:
break
print(arr)

我们得到以下结果:

[2, 3, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

这里for循环直接应用于arr,因此它的修改确实会影响for执行的迭代。

相关内容

  • 没有找到相关文章