やろうと思えばできます

普通は関数のクラスを使いますが、
Python で 累積機を生成する関数は以下のように書けます。
変数を入れ子のスコープ内で渡すためには配列を利用する必要があります。 これは、通常のオブジェクトが値渡しなのに対し、配列が参照渡しされるためです。

トリッキーなのと、かえってめんどくさいのであまりお勧めしません。

[ac.py]

01:     #! /usr/bin/env python
02:     
03:     def genac(n):
04:         
05:         m=[n]
06:         
07:         def aux(i):
08:             m[0]+=i
09:             return m[0]
10:         
11:         return aux
12:     
13:     if __name__=='__main__':
14:         foo=genac(10)
15:         print 'foo=genac(10)   # making an accumulator whose initial value is 10'
16:         baz=genac(100)
17:         print 'baz=genac(100)  # making an accumulator whose initial value is 100'
18:         print 'foo(3) = ', foo(3)  #  13
19:         print 'baz(1) = ', baz(1)  # 101
20:         print 'foo(5) = ', foo(5)  #  18
21:         print 'baz(2) = ', baz(2)  # 103
$python ac.py
foo=genac(10)   # making an accumulator whose initial value is 10
baz=genac(100)  # making an accumulator whose initial value is 100
foo(3) =  13
baz(1) =  101
foo(5) =  18
baz(2) =  103

[戻る]