为什么函数执行后变量仍然可用?

eva*_*n54 1 python

我试图在这里更好地理解范围.

def f1():
    a = 1
    def g1(X):
        return X+a
    return g1

def f2():
    a = 1
    def g2(X):
        return X+1
    return g2

g1 = f1()
print g1(4)
g2 = f2()
print g2(4)
# both give 5 as you'd expect
Run Code Online (Sandbox Code Playgroud)

我的问题是没有a被破坏?它在哪个范围内?我的一般理解是,在f2函数返回时,a 的第二种情况绝对不可用.这种方式,例如,如果你有一个巨大的数组或内存方面的变量,一旦函数返回它们就不复存在了.

这里发生了什么?

编辑:

这里有空吗?

def f1():
    a = 1
    b = 1
    def g1(X):
        return X+a
    return g1
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 5

如果一个函数包含另一个函数,并且内部函数包含对外部函数中变量的引用,并且在外部函数结束之后内部函数仍然是"活着的"(即返回它或以某种方式创建引用),创建一个闭包,它"保存"这些变量,使它们在调用时可用于内部函数.

在第二个示例中,b不可用,因为内部函数g1不引用它,因此它不会保存在闭包中.