用闭包模拟python中的静态变量

Moe*_*Moe 1 python static closures

是否可以在 python 中编写一个函数,它接受一个参数 a 并打印 h+a 的结果,其中 h 是一个局部变量。然后它应该返回自身,h 增加一。

ben*_*n w 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>
Run Code Online (Sandbox Code Playgroud)

以前的版本需要伪造它:

>>> 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>
>>> 
Run Code Online (Sandbox Code Playgroud)

(ETA:我想我误解了问题的一部分,因为您似乎希望由f(并且返回自身)返回的函数接受参数,但这是一个微不足道的更改。)

  • 基本上,在python3之前,如果你试图在inner()中*assign*给h,“h”被认为是inner()本地的。所以你有两个选择:(a)分配然后使用。然后,inner() 中的 h 会影响 f() 中的 h,并且不会在调用之间保留,这不是您想要的。(b) 使用然后分配。但是因为它被认为是局部到内部的,所以你不能在分配它之前使用它——它还没有被绑定。使用 h = [1],你在内部所做的就是使用它——你引用它,但你永远不会分配给 *h 本身*。您只需分配给 h[0]。 (2认同)