【问题标题】:Scope and Namespace in PythonPython 中的作用域和命名空间
【发布时间】:2017-11-12 14:33:49
【问题描述】:

在浏览 Python Scope 文档时,我遇到了以下代码,但我不确定该代码的执行方式。有人能解释一下这段代码吗?

def scope_test():
    def do_local():
        spam = "local spam"

    def do_nonlocal():
        nonlocal spam
        spam = "nonlocal spam"

    def do_global():
        global spam
        spam = "global spam"

    spam = "test spam"
    do_local()
    print("After local assignment:", spam)
    do_nonlocal()
    print("After nonlocal assignment:", spam)
    do_global()
    print("After global assignment:", spam)

scope_test()
print("In global scope:", spam)

【问题讨论】:

  • 你的问题是什么?

标签: python-3.x


【解决方案1】:

最简单的方法 - 运行程序! 这是输出:

After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam

如您所见,nonlocal 在定义的范围内具有优先权。一旦出来,就使用全局定义。无需重置全局值,这是自动完成的。当然,nonlocal 会覆盖本地分配。

编辑:请参阅this related question 了解更多信息。

【讨论】:

  • 还是不明白为什么会这样。你能解释一下为什么这是一步一步的输出吗?为什么我们调用 do_local(),为什么 spam 没有改变?当我们调用do_global()的时候,为什么在scope_test里面,还是nonlocal的,而实际上spam变成了global spam?
  • 来自 Python 文档:“nonlocal 语句导致列出的标识符引用最近的封闭范围内的先前绑定的变量,不包括全局变量”。在这种情况下,“最近的封闭范围”是 scope_test() 函数。所以在这个函数中的任何地方,我们都会得到非局部值,即使在设置了全局值之后也是如此。最后一次调用来自全局范围,因此该值是全局值。第一个调用是 do_local(),在我们将字段设置为非本地之前,因此我们获得了本地值。如果你最终尝试再次调用 do_local() ,你将获得非本地值。
猜你喜欢
  • 2016-12-13
  • 2022-08-16
  • 1970-01-01
  • 2018-10-10
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多