我正在研究闭包,但我对如何改变它们的内部状态有点困惑。
考虑以下两个示例:
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
。
1条答案
按热度按时间xzabzqsa1#
发生错误的原因是内部函数中存在对
y
的赋值(即有y =
)。这将导致创建一个名为y
的新局部变量,它隐藏了外部变量y
。在
y=
的右边还有y
。它引用同一个本地y
,但尚未初始化。由于你的目的是使用外部变量
y
而不是创建一个新的内部变量,你应该把它放在函数_lpf
的开头:在另一个例子中,没有问题,因为没有对
sample
进行赋值。