Accumulator Generator

PythonクロージャD言語寄りなんでしょうか。
以下のコードは普通に動く

>>> b = (lambda x: lambda y: x+y)( 90 )
>>> b( 10 )
100


でも以下のように累積できない。

>>> def foo1( x ) :
...     def foo2( y ) :
...             x += y
...             return x
...     return foo2
...
>>> f = foo1( 95 )
>>> f( 1 )
Traceback (most recent call last):
  File , line 0, in <string>##36
  File , line 0, in _stub_##24
  File , line 0, in foo2
UnboundLocalError: local variable 'x' referenced before assignment

本当のxじゃない何者かに置き換わってるってことですかね。


ちょっと探してたら,ポールグレアム氏のページに辿り着きました。

Accumulator Generator
http://www.paulgraham.com/accgen.html
そこにあったコードはこんな感じ

>>> class foo:
...     def __init__(self, n):
...          self.n = n
...     def __call__(self, i):
...          self.n += i
...     return self.n
...
# 以下は付け足したコード
>>> f = foo( 10 )
>>> f( 10 )
20
>>> f( 10 )
30


発想の転換というか卑怯というか><;


関係ないけど,Pythonラムダ式は他の言語と比べるとちょっと使いづらい