我运行了以下代码
global_var1 = 1
global_var2 = 2
def func():
print(global_var1)
print(global_var2)
global_var2 = 3
func()
它抛出错误
Traceback (most recent call last):
File "/home/harish/PycharmProjects/try/scope.py", line 10, in <module>
func()
File "/home/harish/PycharmProjects/try/scope.py", line 7, in func
print(global_var2)
UnboundLocalError: local variable 'global_var2' referenced before assignment
但以下代码有效
__author__ = 'harish'
global_var1 = 1
global_var2 = 2
def func():
print(global_var1)
print(global_var2)
func()
我的期望是调用功能func
的时候。它会寻找global_var1
并且它不是本地的所以它看起来全局并打印它。
然后类似地它会寻找global_var1
并且它不是本地的所以它看起来全局并打印它。然后它会在localscope中创建一个变量global_var2
并分配3。
可能没有像上面那样完成,因为在相同的函数范围内,同一个变量global_var2
具有不同的含义。直到第2行它指的是全局然后在本地之后..我的猜测是否正确?
答案 0 :(得分:1)
global
声明应该放在函数中:
def func():
global global_var2
print(global_var1)
print(global_var2)
global_var2 = 3
他们告诉python函数内部名称global_var2
是指全局范围而不是本地范围。将global
声明置于最高级别无用。
Python不允许同一个名称在单个范围内引用两个不同的范围,因此赋值global_var2 = 3
强制该变量是本地的。因此,如果您尝试在它引发错误之前打印它。但是如果你对python说这个名字实际上是全局名称,那么python知道他应该从该范围中获取值并分配给全局范围。
特别是:
a = 1
def f():
print(a)
a = 2
此处a
中的print(a)
和a
中的a = 2
始终指的是同一个变量。在上面的代码中,内部f
是 local ,因为没有提供声明并且有一个赋值。因此print(a)
尝试访问没有值的局部变量。
如果您添加global
:
a = 1
def f():
global a
print(a)
a = 2
现在a
中的所有f
都引用了全局a
,因此print(a)
打印1
,因为它是全局变量的值,之后执行f
该值将变为2
。
答案 1 :(得分:1)
Python在编译时在函数中查找局部变量。每个功能只有一个范围。所以global_var2
是本地的,因为它在函数的最后一行被定义为局部变量。