为什么这种行为不同?我对吗?

时间:2015-06-27 11:34:32

标签: python

我运行了以下代码

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行它指的是全局然后在本地之后..我的猜测是否正确?

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是本地的,因为它在函数的最后一行被定义为局部变量。