【问题标题】:Namespace - scope python命名空间 - 作用域 python
【发布时间】:2016-12-13 07:37:45
【问题描述】:

我对 LEGB 的规则如何在这里应用感到很困惑。一世 了解 Local 可以在函数或类方法中,因为 例子。 Enclosed 可以是它的封闭函数,例如,如果一个函数 被包裹在另一个函数中。全局指的是最上面的 执行脚本本身的级别,而 Built-in 是特殊名称 Python 为自己保留的。我只是不明白它在这里是如何应用的以及>为什么输出是这样的。谢谢

a = 'global'

def outer():

    def len(in_var):
        print('called my len() function: ')
        l = 0
        for i in in_var:
            l += 1
        return l

    a = 'local'

    def inner():
        global len
        nonlocal a
        a += ' variable'
    inner()
    print('a is', a)
    print(len(a))

outer()

print(len(a))
print('a is', a)

输出

('a is', 'local')
called my len() function: 
5
15
('a is', 'global variable')

【问题讨论】:

  • 我在 python 3.5.2 中得到不同的输出。

标签: python scope namespaces closures


【解决方案1】:

我在 3.4.2 中得到以下结果

a is local variable
called my len() function: 
14
6
a is global

为了解释,实际上你得到了几乎所有重要的细节,但关键是nonlocal 语句导致标识符引用最近封闭范围内的先前绑定变量,这意味着inner() 中的a 指的是并影响a = 'local',所以在那之后; print('a is', a) 使用 a 作为 local variable 并且长度为 14。但是在全局范围内 a = 'global' 仍然有效。

您能否分享一下您的环境的详细信息,以便我们调查差异?

【讨论】:

  • 嗨赫瓦尔。谢谢。我使用 PyCharm 2016.2 指向 Anaconda 作为模块。不过python的版本是2.7。我仍然对增量是如何发生的以及输出顺序感到困惑,尽管我认为我理解了规则..
  • 你确定python 2.7吗? Afaik,nonlocal 不适用于该版本,所以你应该得到错误。
  • 是的,我认为 PyCharm 具有前向兼容性。 PyCharm 将根据指定的两个或多个 Python 版本检查代码兼容性。
  • 以前从未听说过 :) 我的理解是,由于 2.7 中不存在 nonlocal,因此在您的代码执行中它被视为全局。因此,inner() 中的所有东西都会影响 a='global'。
猜你喜欢
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2015-09-12
  • 2022-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多