Python 是否重新定义了函数内变量作用域的猜测?

问题描述 投票:0回答:1

我有一个让我困惑的简单例子,涉及函数中的局部和全局作用域。

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。我真的有点迷失了,希望有人能解释为什么当各个位工作正常时会出现组合错误。

python function scope global local-variables
1个回答
3
投票

当您对作用域中的

a
变量进行赋值时,它会变为 该作用域的本地变量 并隐藏外部作用域中任何类似命名的变量。由于 Python 的作用域是静态的,因此
a
是本地还是全局是在 编译时 确定的,这就是为什么当涉及
func()
时,Python 认为
a
是在函数体内分配的,并将其视为本地变量变量贯穿整个函数。当您尝试在
local
print(a) 已在函数内
 赋值之前 
a 时,您将面临错误。当您注释掉 a = 2
 时,
a
 被视为全局,并且 
print()
 执行成功。

© www.soinside.com 2019 - 2024. All rights reserved.