如何在python中正确更改闭包的内部状态?

envsm3lx  于 2023-10-21  发布在  Python
关注(0)|答案(1)|浏览(130)

我正在研究闭包,但我对如何改变它们的内部状态有点困惑。
考虑以下两个示例:

def mean():
    sample = []

    def inner_mean(number):
        sample.append(number)
        return sum(sample) / len(sample)

    return inner_mean

def lpf(fs):
    y = 0.0

    def _lpf(fc, u):
        y = (1 - fc / fs) * y + fc / fs * u
        return y

    return _lpf

第一种情况下运行没有任何问题,而第二种情况下,我在赋值 * 之前引用了封闭作用域中的 * 变量'y'。
为什么在第一个例子中不会发生这种情况?我该如何修改第二个例子使它工作呢?
为了更清楚,一旦我创建了一个函数,我希望在每次函数调用时记住内部状态y的值。
例如,如果执行以下操作:

lpf_zero_three = lpf(0.3)

lpf_zero_three(1.2, 0.2)  
lpf_zero_three(1.2, 3.1)

lpf_zero_three(1.2, 3.1)调用的返回值将取决于从lpf_zero_three(1.2, 0.2)调用获得的值y

xzabzqsa

xzabzqsa1#

发生错误的原因是内部函数中存在对y的赋值(即有y =)。这将导致创建一个名为y的新局部变量,它隐藏了外部变量y
y=的右边还有y。它引用同一个本地y,但尚未初始化。
由于你的目的是使用外部变量y而不是创建一个新的内部变量,你应该把它放在函数_lpf的开头:

nonlocal y

在另一个例子中,没有问题,因为没有对sample进行赋值。

相关问题