繁体   English   中英

Python嵌套for循环变量'overwrite'

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM