![](/img/trans.png)
[英]In a Python for loop, If you define a variable as an element for the for loop, will it overwrite the previous definition?
[英]Python nested for loop variable 'overwrite'
对于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
有人可以解释一下如何最好地解决这个问题?
我认为它'过早停止'(最后一个输出v = 1 w = 3缺失)导致分配给'w'变量的最后一个值在最后一个循环运行之前为3
正确。
有人可以解释一下如何最好地解决这个问题?
不要为两个不同的含义重复使用相同的局部变量名称:
n_v, n_w = 2, 4
for v in range(n_v):
for w in range(n_w):
print('v=', v, 'w=', w)
在我看来,最值得注意的是, 只要你for v in range(v)
迭代中保持相同的range(w)
就不会更新。 这就是你得到的原因:
v = 0, w = 0
v = 0, w = 1
v = 0, w = 2
v = 0, w = 3
但是 ,在第二次迭代中,当你的v
变为1
,使用新的w
值(现在为3
range(w)
重新定义 range(w)
。 这就是为什么你得到:
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
嗨,彼得从wim看到答案他是对的。
重写如下代码: -
v,w = 2,4
for v1 in range(v):
for w1 in range(w):
print('v=',v1,'w=',w1)
这种行为称为for循环中的变量泄漏 ,这是因为Python不会在for循环中创建新变量。
在for w in range(w):
中for w in range(w):
结束时, w
值为3,因此当您再次运行循环时,它将运行范围(3)和范围(4),其原始值为w
如您所料。
为避免这种情况,请在for
循环中使用其他变量,如其他答案中所示。
for循环变量未暴露给周围函数的唯一情况是列表推导(并且仅在Python 3中,参见PEP- Generator表达式 ),例如
>>> for v in range(v):
... print([('v=',v,'w=',w) for w in range(w)])
... print(w)
...
[('v=', 0, 'w=', 0), ('v=', 0, 'w=', 1), ('v=', 0, 'w=', 2), ('v=', 0, 'w=', 3)]
4
[('v=', 1, 'w=', 0), ('v=', 1, 'w=', 1), ('v=', 1, 'w=', 2), ('v=', 1, 'w=', 3)]
4
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.