我只是想知道如果一个变量是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执行的迭代。