我有一个让我困惑的简单例子,涉及函数中的局部和全局作用域。
a=1
def func():
print(a) # Error: local variable 'a' referenced before assignment
a=2
print(a)
func()
如果我评论第一个打印语句,它运行正常。本地“a”优先于全局“a”,因此第二次打印给出 2。
如果我注释 a=2,则本地范围内的打印语句会看到全局范围并打印 a=1。
令我困惑的是,当我运行整个函数时,python 会抛出一个错误:“赋值前引用了局部变量‘a’”
我期望的是第一个 print(a) 产生 1,第二个 print(a) 产生 2。
我正在努力将其分开。我检查了 func() 内部的 locals() ,因此第一个打印函数看不到本地,但它确实看到了全局 a。我真的有点迷失了,希望有人能解释为什么当各个位工作正常时会出现组合错误。
当您对作用域中的
a
变量进行赋值时,它会变为 该作用域的本地变量 并隐藏外部作用域中任何类似命名的变量。由于 Python 的作用域是静态的,因此 a
是本地还是全局是在 编译时 确定的,这就是为什么当涉及 func()
时,Python 认为 a
是在函数体内分配的,并将其视为本地变量变量贯穿整个函数。当您尝试在 local
print(a)
已在函数内赋值之前
a
时,您将面临错误。当您注释掉 a = 2
时,
a
被视为全局,并且
print()
执行成功。