python中的全局变量重新分配

时间:2018-10-26 10:50:06

标签: python python-2.7 hoisting

当我尝试在函数内部重新分配变量时,出现UnboundLocalError错误。以下是我的问题的摘要。

global_variable = 'a'

def abc():
    print(global_variable)
    global_variable = 'b'

abc()

当我执行它时,我得到以下信息:

Traceback (most recent call last):
  File "/Users/arghyasaha/hobby_project/python_experiment/python_experiment/random_experiment/del_me.py", line 7, in <module>
    abc()
  File "/Users/arghyasaha/hobby_project/python_experiment/python_experiment/random_experiment/del_me.py", line 4, in abc
    print(global_variable)
UnboundLocalError: local variable 'global_variable' referenced before assignment

要解决此问题,我们可以使用global这样的关键字

global_variable = 'a'

def abc():
    global global_variable
    print(global_variable)
    global_variable = 'b'

abc()

我正在寻找一种解释,对此行为,似乎有点类似于javascript中的提升概念。我确实发现很少的资源,例如source1source2,但是都没有足够的解释。有人可以对python幕后的确切情况给出正确的解释吗?

4 个答案:

答案 0 :(得分:0)

这是因为Python编译器在确定哪些变量在该代码块本地时会查看该代码块中的所有l值。由于在您的代码中,global_variableabc的功能块中用作左值,因此在编译时它被视为abc代码块的局部变量,并且这样,当您在同一块中为abc分配值之前尝试尝试print(global_variable)时,在global_variable中为其分配值之前,就认为该引用已被引用。

答案 1 :(得分:0)

变量不能在函数内部是局部的和全局的。因此,Python决定由于要对abc()内部的global_variable进行赋值而需要局部变量,因此,在global_variable定义之前的第一个print语句会抛出上述错误消息。如果尚未在函数内部更改或创建的任何变量未声明为全局变量,则该变量为局部变量。为了告诉Python我们要使用全局变量,我们必须使用关键字“ global”明确声明这一点

您可以参考 https://www.python-course.eu/python3_global_vs_local_variables.php 以获得更多信息。

答案 2 :(得分:0)

问题是,当您运行代码并将其输入到函数中时,它具有一个作用域,其中尚未定义global_variable。

答案 3 :(得分:0)

请注意,如果您写过

def cba():
    global_variable = 'b'
    print(global_variable)

cba()

不会是一个例外。这是因为,尽管global_variable叫它名字,但在函数范围内将是一个局部变量。您在函数中分配给变量的任何变量都是局部变量,除非您另外明确指出。

在函数中,当您访问变量(以某种方式使用它的值,如在这些示例中将其打印出来)时,python将首先在局部范围内查找变量,然后在全局范围内查找。

def xyz():
    print(global_variable)

例如,将访问全局变量。

当python尝试编译您的函数时,它会发现global_variable被分配给它,因此试图将其视为本地,但随后会尝试在该作用域中定义它之前对其进行访问。

global关键字告诉python将该名称视为在该函数的全局作用域中引用,因此赋值会更改全局变量,而不会在本地作用域中引入新变量。