Python闭包使用的缺陷相比于js或者scheme
标签 Python sicp js

累加器的实现
Python
def foo(n): s=[0] def bar(i): s[0]=s[0]+i return s[0] return bar def foo(n): def bar(i): n=n+i return n+i return bar
js
function foo(n){ return function(i){ n=n+i; return n; } }
scheme
(define inc(init) (lambda (i) (begin (set! init (+ init i)) init)) )
python第二种方法会报错,local variable 'n' referenced before assignment 相对于js,和scheme来说,python用=赋值语句声明变量,所以n=n+i相当于另行声明了一个n与外部n无关,而右侧又引用了自己此时还未赋值,所以会报错。
参考 http://www.ruanyifeng.com/blog/computer/
问题出现的原因:
最新评论