当我尝试在函数内部重新分配变量时,出现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中的提升概念。我确实发现很少的资源,例如source1,source2,但是都没有足够的解释。有人可以对python幕后的确切情况给出正确的解释吗?
答案 0 :(得分:0)
这是因为Python编译器在确定哪些变量在该代码块本地时会查看该代码块中的所有l值。由于在您的代码中,global_variable
在abc
的功能块中用作左值,因此在编译时它被视为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将该名称视为在该函数的全局作用域中引用,因此赋值会更改全局变量,而不会在本地作用域中引入新变量。