gpt4 book ai didi

python - 在 Python 中返回累​​加器的函数

转载 作者:太空狗 更新时间:2023-10-30 01:04:50 25 4
gpt4 key购买 nike

我正在阅读Hackers and Painters,我对作者提到的一个问题感到困惑,该问题说明了不同编程语言的强大功能。

问题是:

We want to write a function that generates accumulators—a function that takes a number n, and returns a function that takes another number i and returns n incremented by i. (That’s incremented by, not plus. An accumulator has to accumulate.)

作者提到了几种不同编程语言的解决方案。例如,Common Lisp:

(defun foo (n)
(lambda (i) (incf n i)))

和 JavaScript:

function foo(n) { return function (i) { return n += i } }

但是,当涉及到Python时,下面的代码是行不通的:

def foo(n):
s = n
def bar(i):
s += i
return s
return bar

f = foo(0)
f(1) # UnboundLocalError: local variable 's' referenced before assignment

一个简单的修改就可以让它工作:

def foo(n):
s = [n]
def bar(i):
s[0] += i
return s[0]
return bar

我是 Python 新手。为什么第一个解决方案不起作用而第二个解决方案起作用?作者提到了词法变量,但我还是不明白。

最佳答案

s += i 只是 s = s + i 的糖。*

这意味着您为变量 s 分配了一个新值(而不是就地改变它)。当你赋值给一个变量时,Python 假定它是函数的局部变量。然而,在赋值之前它需要评估s + i,但是s是本地的并且仍然未赋值->错误。

在第二种情况下,s[0] += i 您永远不会直接分配给 s,而只会访问 s 中的项目.所以 Python 可以清楚地看到它不是局部变量,并在外部范围内寻找它。

最后,一个更好的选择(在 Python 3 中)是明确告诉它 s 不是局部变量:

def foo(n):
s = n
def bar(i):
nonlocal s
s += i
return s
return bar

(实际上不需要 s - 您可以简单地在 bar 中使用 n。)

*<子> The situation is slightly more complex ,但重要的问题是计算和分配是在两个单独的步骤中执行的。

关于python - 在 Python 中返回累​​加器的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49046554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com