很抱歉这个noob问题,但有人请解释一下这个嵌套for循环的内部工作原理。
v,w = 2,4
for v in range(v):
for w in range(w):
print('v=',v,'w=',w)
如果我这样运行,输出将如下:
v= 0 w= 0
v= 0 w= 1
v= 0 w= 2
v= 0 w= 3
v= 1 w= 0
v= 1 w= 1
v= 1 w= 2
我认为它'过早停止'(最后一个输出v = 1 w = 3缺失)导致在最后一个循环运行之前分配给'w'变量的最后一个值是3。
如果我像这样运行它,它可以工作,但至少可以说Pythonic。
v,w = 2,4
for v in range(v):
for w in range(w):
print('v=',v,'w=',w)
w = 4
有人可以解释一下如何最好地解决这个问题吗?
答案 0 :(得分:6)
我认为它过早停止' (最后一个输出v = 1 w = 3缺失)导致最后一个值分配给' w'在最后一个循环运行之前变量是3
正确。
有人可以解释一下如何最好地解决这个问题吗?
不要为两种不同的含义重复使用相同的本地变量名称:
speed = np.random.randint(0,5)
L[L > 0] = speed
答案 1 :(得分:1)
在我看来,最值得注意的是range(w)
只要保持同一for v in range(v)
次迭代,就不会更新。这就是你得到的原因:
v = 0, w = 0
v = 0, w = 1
v = 0, w = 2
v = 0, w = 3
但是,在第二次迭代中,当您的v
变为1
,range(w)
使用新{{}重新定义时w
1}}现在为3
的值。这就是为什么你得到:
v = 1, w = 0
v = 1, w = 1
v = 1, w = 2
解决问题,例如@wim说的很简单;你只需要使用不同的变量:
for i in range(v):
for j in range(w):
# do your thing
以上的副作用是,即使编写一个可怕的东西,以下也会执行5次:
v = 5
for v in range(v):
# do your thing
答案 2 :(得分:0)
嗨彼得看到他的回答是正确的。
重写如下代码: -
v,w = 2,4
for v1 in range(v):
for w1 in range(w):
print('v=',v1,'w=',w1)
答案 3 :(得分:0)
这种行为在for循环中称为变量泄漏,这是因为Python不会在for循环中创建新变量。
在for w in range(w):
结束时,w
的值为3,因此当您再次运行循环时,它将针对范围(3)和范围(4)运行,其原始值为{{1正如你所预期的那样。
要避免这种情况,请在w
循环中使用其他变量,如其他答案所示。
for循环变量未暴露给周围函数的唯一情况是列表推导(并且仅在Python 3中,请参阅PEP- Generator Expressions),例如
for