【问题标题】:Python Block Scopes - Someone explain thisPython Block Scopes - 有人解释一下
【发布时间】:2016-11-22 10:43:27
【问题描述】:

我运行了这段代码,结果令人惊讶。我知道我正在重用 i,我的问题是为什么循环在第一次迭代后没有退出,因为 i 被重新分配了!

代码:

for i in range(3):
    print '====='
    print 'Outer I: ', i
    print '====='
    for j in range(2):
        print 'J', j
        for i in range(5):
            print 'Inner I', i
    print '====='
    print 'Outer I Again: ', i
    print '====='

输出:

=====
Outer I:  0
=====
J 0
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
J 1
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
=====
Outer I Again:  4
=====
=====
Outer I:  1
=====
J 0
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
J 1
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
=====
Outer I Again:  4
=====
=====
Outer I:  2
=====
J 0
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
J 1
Inner I 0
Inner I 1
Inner I 2
Inner I 3
Inner I 4
=====
Outer I Again:  4

以下是令人困惑的事情:

  • 我希望循环在第一次迭代后中断,但它 才不是。
  • 出于同样的原因,第一个打印语句“Outer I” 打印 i 的正确值。
  • 第二个外部打印语句 “Outer I Again”打印出错误的值。

我正在使用 CPython 在 Python 2.7 上运行它。

【问题讨论】:

  • 您的代码错误,您在内部循环中重用了i 变量:for i in range(5):
  • 做一件事,也许你会找到你想要的。用另一个变量 k 替换 inner i。你会看到它会像魔术一样工作! ;)
  • Python 中没有块作用域。见Short Description of Scoping RulesBlock scope in Python

标签: python scope


【解决方案1】:

此代码中没有内部i 或外部i,只有一个i 变量在两个不同的循环中分配。 为什么第一次迭代后循环会中断? Python 的for 基本上是其他语言中的for each 循环,它对给定的迭代器或生成器的成员进行迭代。 range 函数返回元素列表[0,1,2,3,4],每次迭代i 都会从列表中获得下一个值,i 的当前值与外循环无关。

这就是为什么第一个 Outer I 打印您期望的 i 值,而第二个(在内循环之后)没有。

【讨论】:

    【解决方案2】:

    您正在内部循环中重用 i 变量:

    for i in range(5)
    

    如你所见:

    Outer I Again:  4
    

    如果您将其更改为不同的变量名,那么它会按预期工作:

    In [12]:
    for i in range(3):
        print( '=====')
        print( 'Outer I: ', i)
        print( '=====')
        for j in range(2):
            print( 'J', j)
            for l in range(5):
                print( 'Inner I', l)
        print( '=====')
        print( 'Outer I Again: ', i)
        print( '=====')
    
    =====
    Outer I:  0
    =====
    J 0
    Inner I 0
    Inner I 1
    Inner I 2
    Inner I 3
    Inner I 4
    J 1
    Inner I 0
    Inner I 1
    Inner I 2
    Inner I 3
    Inner I 4
    =====
    Outer I Again:  0
    =====
    =====
    Outer I:  1
    =====
    J 0
    Inner I 0
    Inner I 1
    Inner I 2
    Inner I 3
    Inner I 4
    J 1
    Inner I 0
    Inner I 1
    Inner I 2
    Inner I 3
    Inner I 4
    =====
    Outer I Again:  1
    =====
    =====
    Outer I:  2
    =====
    J 0
    Inner I 0
    Inner I 1
    Inner I 2
    Inner I 3
    Inner I 4
    J 1
    Inner I 0
    Inner I 1
    Inner I 2
    Inner I 3
    Inner I 4
    =====
    Outer I Again:  2
    =====
    

    【讨论】:

      【解决方案3】:

      您正在重用变量,但目标变量保持不变。在这种情况下,变量的范围不会随内部 i 改变。对于使用字符串或整数等不可变对象,您不会遇到问题。使用其他变量而不是第二个 i 就可以了。

      【讨论】:

      • 可变性与它无关 - 而示例 is 实际上使用整数,您指出它是不可变的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 2011-11-22
      相关资源
      最近更新 更多