Python闭包和变量查找

Hyp*_*eus 1 python closures

以下代码按预期工作:

def f():
    def g():
        print(a)
    a = 42
    return g
f()()
Run Code Online (Sandbox Code Playgroud)

ga从它的关闭装载,一切都很好.

现在这个片段失败了UnboundLocalError.

def f():
    def g():
        print(a)
        a = 43
    a = 42
    return g
f()()
Run Code Online (Sandbox Code Playgroud)

看看dis,第一个代码调用LOAD_CLOSURE,第二个没有调用.考虑到这一点,很明显为什么会出现错误.但问题是:

python如何知道何时从闭包或本地范围中绘制变量?(考虑到print(a)先于a = 43.)

这个决定是在编译时做出的吗?(好吧,看起来像它,考虑到print(a)先前a = 43)

这篇文章不是关键字nonlocalglobal关键字.

use*_*ica 5

在缺少nonlocalglobal声明的情况下,Python通过检查函数的变量赋值来确定变量在字节码编译时是否是本地的.由于第二个例子分配到ag,a是本地g的那个版本.