我正在处理某些代码,这种情况与下面提供的代码类似。似乎在第二个for循环中,num的值的变化被识别,而在第一个for循环的值中则没有。为什么不呢,我将如何以一种可以识别它的方式编写它呢?
my-website.com/test
代码开始于我期望的(0,0),(0,1)等,但是随着j到达其范围的末端而结束于(2,4)。我不明白为什么第一个for循环不知道num已更新。
答案 0 :(得分:2)
您似乎希望for循环的行为像while循环。
让我们写一个更简单的示例,看看发生了什么事。
num = 5
for j in range(num):
print(j)
if j == 3:
num = num + 1
0
1
2
3
4
<--- No 5
您似乎希望上述行为等同于以下代码片段。
num = 5
j = 0
while j < num:
print(j)
if j == 3:
num += 1
j += 1
0
1
2
3
4
5 <-- updating num added a value in the output
for循环和while循环之间的根本区别在于,只要条件为true,while循环就会运行,并且它会在每次迭代时重新评估条件。同时,for循环遍历可迭代对象(在这种情况下为range
)中的项目,每次操作都不会重新评估可迭代 。
range
对象让我们看另一个示例,该示例解释了为什么range(num)
递增时可迭代的num
不会更新。
num = 5
r = range(num)
print(r) # range(0, 5)
num += 1
print(r) # still range(0, 5)
调用range(num)
时,将创建一个可迭代的对象。它接收值5
作为上限,完全不关心名称num
。如您所见,当num
更新时,对象r
不受影响。为什么会这样?它被赋予了值5
,这是它关心的一切。
如果未重新评估for循环的可迭代性,为什么内循环并不总是相同?
好吧,正是因为内循环在每次迭代时运行。在外循环的每次迭代中,都会为内循环创建一个新对象range(num)
,并且由于num
到那时已被更新,因此新创建的range
与初始对象不相同。
答案 1 :(得分:0)
“ range(num)”仅被评估一次,而不是在每次迭代中评估一次。因此相当于
for i in range(3):
for j in range(num):
# do something with i and j
答案 2 :(得分:0)
def main():
num=3
for i in range(num):
# Exiting nested for-loop causes range(num) to be re-evaluated
for j in range(num):
print(i, j)
if num < 5:
num=num+1
# Now that we have exited the first for-loop,
# range(num) is re-evaluated and 0,1,2,3,4 is printed
for i in range(num):
print(i)
if __name__ == '__main__':
main()
答案 3 :(得分:0)
num值在调用for循环时被锁定。 num的值仅在执行时不调用时才更新。