记住的值和范围从内存中消失,在 Python 闭包中



下面是我在本教程中找到的一段简单的代码。

这是我在这里找到的 Closure 的一个很好的定义:"一个函数对象,它记住封闭作用域中的值,而不管这些作用域是否仍然存在于内存中。

我认为下面rotate()是一个结束。请帮助我了解即使在其范围从内存中消失后,它仍然会记住哪些值(以及为什么它们的作用域会离开内存)?

def make_rotater(seq):
    def rotate():
        val = seq.pop(0)
        seq.append(val)
        return val
    return rotate
r = make_rotater([1,2,3])
r()
# 1
r()
# 2

更新)第2部分:为什么下面的(无闭包)代码不起作用?

def make_rotater(seq):
    val = seq.pop(0)
    seq.append(val)
    return val
r = make_rotater([1,2,3])
r()
# File "<stdin>", line 1, in <module>
# TypeError: 'int' object is not callable

它会记住make_rotator的本地值,因此如果您这样做:

def make_rotater():
    seq=[1,2,3]
    def rotate():
        val = seq.pop(0)
        seq.append(val)
        return val
    return rotate

seq 由 rotate 引用,因此它将保留在内存中,以便您调用 rotate,即使它是在 make_rotater 中定义的(已经完成,并从内存中清除)

当你调用make_rotater时,它会创建一个新的 seq 并定义引用 seq 的旋转方法,所以你留下一个make_rotater它的内存除了 seq 之外不需要它(因为 rotate 仍然使用它)。当您不再引用旋转时,seq 也会被清理

篇二:

你的方法现在不返回另一个方法,它直接返回数字,所以你不需要做 r()

你可以像这样使用它:

seq = [1,2,3]
def make_rotater(seq):
    val = seq.pop(0)
    seq.append(val)
    return val
r = make_rotater(seq)
print r # prints 1, note there is no r() just r
r = make_rotater(seq)
print r # prints 2
r = make_rotater(seq)
print r # prints 3

这个定义有点对,有点错。这取决于您所说的范围"仍然存在于内存中"是什么意思。我会说更好的定义是"一个函数对象,它记住封闭作用域中的变量,而不管这些作用域是否仍然存在于调用堆栈中。

当您致电make_rotater

def make_rotater(seq):
    def rotate():
        val = seq.pop(0)
        seq.append(val)
        return val
    return rotate

rotate闭包使seq变量即使在执行离开make_rotater范围后仍处于活动状态。通常,当执行离开函数时,其局部变量将不复存在。

最新更新