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

时间:2014-11-25 20:19:11

标签: 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

我的问题是,a被摧毁了吗?它在哪个范围内?我的一般理解是,在f2的第二种情况下,一旦函数返回肯定不可用。这种方式,例如,如果你有一个巨大的数组或内存变量,一旦函数返回它们就不再有了。

这里发生了什么?

修改

这里有空吗?

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

1 个答案:

答案 0 :(得分:5)

如果一个函数包含另一个函数,并且内部函数包含对外部函数中变量的引用,并且在外部函数结束后内部函数仍处于“活动”状态(即,返回它或以某种方式创建引用it),创建一个闭包,“保存”这些变量,使它们在被调用时可用于内部函数。

在你的第二个例子中,b不可用,因为内部函数g1没有引用它,因此它不会保存在闭包中。