【问题标题】:How does python's global keyword work?python 的 global 关键字是如何工作的?
【发布时间】:2014-09-05 03:00:22
【问题描述】:
import json

def test():
    print json.dumps({'k': 'v'})
    import json

if __name__ == '__main__':
    test()

会抛出异常:

UnboundLocalError: local variable 'json' referenced before assignment

添加global 关键字

import json

def test():
    global json
    print json.dumps({'k': 'v'})
    import json

if __name__ == '__main__':
    test()

有效。

【问题讨论】:

  • 为什么您需要第二次导入json?为什么你需要在第一次使用后让它出现?为什么你需要这样写你的代码?
  • 可能被骗? stackoverflow.com/q/21978925/748858 -- 我相信还有其他人......

标签: python


【解决方案1】:

对函数中名称的任何赋值都会使该名称成为函数的本地名称。赋值在函数中的哪个位置无关紧要,即使它是函数中的最后一条语句:名称是函数的本地名称。如果您在分配之前使用本地名称,则会收到您看到的错误。

在全局范围内也可以使用该名称并不重要。编译器知道该名称是本地的,并且只会在本地范围内查找它。

import 语句是一种赋值形式。您在函数中的“import json”语句使名称“json”成为函数的本地名称。您在本地导入之前使用该名称,因此您使用的是未绑定的本地名称。

“全局”语句的意思是,即使在赋值语句中使用此名称,它也不是本地名称,而是全局名称。在您的第二个函数中,全局语句使名称“json”引用全局“json”,当您尝试访问它时已经定义了它,因此您的函数可以工作。

【讨论】:

    【解决方案2】:

    python 在第一次解析函数代码时看到import json 语句,并确定json 是一个局部变量。 (如果您分配json,也会发生同样的事情——例如json = 'Hello World!')。当表达式 json.dumps 执行时,python 在本地范围内查找 json 并没有找到它(因此异常)。

    在第二种情况下,当您添加global 时,在解析函数时,您告诉python 始终在全局 范围内查找json。就您而言,它存在于那里,因为您已经导入了它,所以一切都很好。它还告诉 python json 的任何赋值(或导入)都应该将名称(和关联值)存储在全局范围而不是本地范围中。

    【讨论】:

      【解决方案3】:

      在 Python 中有本地(默认)和全局上下文。为每个函数单独初始化一个新的本地上下文,当函数启动时它是空的。全局上下文是全局的,并且由(几乎)模块的每个部分共享。

      通过使用全局指令,您可以从全局上下文中导入一个变量,从而防止在本地变量中查找符号(它是空的,否则会失败)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-17
        相关资源
        最近更新 更多