用闭包在Python中模拟静态变量

1 投票
2 回答
1438 浏览
提问于 2025-04-17 06:32

可以在Python里写一个函数,这个函数接收一个参数a,然后打印出h+a的结果,其中h是一个局部变量。接着,这个函数应该返回自己,并把h的值增加1。

2 个回答

5

在Python 3中,你可以这样做:

>>> def f(a):
...     h = 1
...     def inner():
...             nonlocal h
...             print(a+h)
...             h += 1
...             return inner
...     return inner
... 
>>> g = f(3)  
>>> g = g()
4
>>> g = g()
5 
>>> g = g()
6
>>> g()()()
7 
8
9
<function inner at 0xb71bcd6c>

之前的版本需要一些变通的方法:

>>> def f(a):
...     h = [1]
...     def inner():
...             print a + h[0]
...             h[0] += 1
...             return inner
...     return inner
... 
>>> f(3)()()()
4  
5
6
<function inner at 0x10041f050>
>>> 

(补充说明:我想我误解了问题的一部分,因为看起来你想要的是函数f返回的那个函数(它会返回自己)能够接受参数,不过这只是个小改动。)

2

是的,你可以这样做。

def f(a):
    def inner(h, a):
        print h+a
        return lambda (x): inner(h+1, x)
    return inner(1, a)

这是一个例子。

g = f(0) # +1
g = g(0) # +2
g = g(0) # +3

f(0) # +1
g(0) # +4
g(0) # +4

这个会输出结果。

1
2
3
1
4
4

证明完毕。

撰写回答