Python嵌套for循环变量'overwrite'

时间:2018-02-12 17:03:23

标签: python

很抱歉这个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

有人可以解释一下如何最好地解决这个问题吗?

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变为1range(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