【发布时间】:2023-03-23 09:25:01
【问题描述】:
我正在阅读 Hackers and Painters 并且对作者提到的一个问题感到困惑,以说明不同编程语言的力量。
问题是:
我们想写一个生成累加器的函数——一个接受数字 n 的函数,并返回一个接受另一个数字 i 并返回 n 的函数 增加了 i。 (这是递增,而不是加。累加器必须累加。)
作者提到了几种使用不同编程语言的解决方案。例如,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 新手。为什么第一个解决方案不起作用,而第二个解决方案起作用?作者提到了词法变量,但我还是不明白。
【问题讨论】:
-
A
def引入了一个新范围。如果没有global或nonlocal,则无法在外部范围内重新绑定变量。
标签: python scope closures common-lisp local-variables