Python-为什么需要声明非局部和全局变量?

时间:2019-01-17 21:29:03

标签: python-3.x scope namespaces global-variables

为什么将纯Python 3.x模块中的以下代码视为无效语法?我对指导决定要求在分配之前明确声明全局变量和非局部变量的设计注意事项感兴趣。

def foo():
    global a = 1

2 个答案:

答案 0 :(得分:1)

来自https://docs.python.org/3/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

  

此显式声明是必需的,以提醒您(与类和实例变量的表面类似情况不同),您实际上是在外部范围内修改变量的值

这表明global a之前的声明在更改其值之前是程序员的一项安全措施。另一个原因可能是Python是一种动态类型的语言,因此,如果考虑一下它,那么该特定行看起来就不像常规的Python代码。

我鼓励您阅读https://docs.python.org/3/reference/simple_stmts.html#the-global-statement并尝试使用该语言。最后,您可以在以下其中一种邮件列表中询问该语言的核心开发人员: https://www.python.org/community/lists/。如果您发现任何有趣的东西,请与社区分享。

答案 1 :(得分:0)

global关键字指示应该像globals()中一样在全局名称空间中查找变量。这与const中的c++声明完全不同。因此,在引用global a = 1之前,应该先创建变量a

def foo():
    global a

在没有SyntaxError的情况下可以正常工作。但是由于a并未在函数foo之前定义,所以当您调用NameError时,解释器将返回foo()

最后,关键字global用于修改局部作用域(如函数)中在全局作用域中定义的变量。