python是否重新定义函数内变量范围的猜测?

Mik*_*ith 1 python scope global function local-variables

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

a=1
def func():
    print(a)   # Error: local variable 'a' referenced before assignment
    a=2
    print(a)

func()
Run Code Online (Sandbox Code Playgroud)

如果我评论第一个打印语句,它运行良好。本地“a”优先于全局“a”,因此第二次打印给出 2。

如果我注释 a=2,则本地范围中的打印语句会看到全局范围并打印 a=1。

让我困惑的是,当我运行整个函数时,python 会抛出一个错误:“赋值前引用了局部变量‘a’”

我所期望的是第一个 print(a) 产生 1,第二个 print(a) 产生 2。

我正在努力将其分开。我检查了 func() 内部的 locals() ,因此第一个打印函数看不到本地,但它确实看到了全局 a。我真的有点迷失了,希望有人能解释为什么当各个位工作正常时会出现组合错误。

Mar*_*ski 5

a当您对作用域中的变量进行赋值时,它会成为该作用域的本地变量,并隐藏外部作用域中任何类似命名的变量。由于Python的作用域是静态的,因此是局部的还是全局的在编译时a就确定了,这就是为什么当涉及到时,Python会在函数体中看到赋值并将其视为整个函数中的局部变量。请注意,此时这与函数体中具体发生的位置无关——Python 只需知道它发生就足够了。当您尝试在该函数中真正为local赋值之前,您将面临错误。然而,当您注释掉时,本地就消失了,Python 会看到全局范围内的本地,因此在此时被分配一个值时会成功执行。func()aprint(a) aa = 2aprint(a)a