>>> def QQ():
... a = 0
... def QQQ():
... global a
... a += 1
... QQQ()
...
>>> QQ()
NameError: global name 'a' is not defined
在这种情况下似乎global
不起作用。除了 1 元素列表技巧,我还能做什么?
>>> def QQ():
... a = 0
... def QQQ():
... global a
... a += 1
... QQQ()
...
>>> QQ()
NameError: global name 'a' is not defined
在这种情况下似乎global
不起作用。除了 1 元素列表技巧,我还能做什么?
如果您使用的是 Python 3.x,则可以使用nonlocal
:
>>> def QQ():
... a = 0
... def QQQ():
... nonlocal a
... a += 1
... QQQ()
... return a
...
>>> QQ()
1
如果您使用的是 Python 2.x,则不能这样做。这就是nonlocal
添加的原因。因此,您必须使用某种可变包装器,例如 1 元素列表技巧。*
PEP 3104解释了所有血淋淋的细节(包括为什么 Python 默认不执行“经典静态嵌套作用域”,并要求您明确说明)。
* 当然,或者升级到 3.x。每当您发现自己询问如何绑定到非本地变量、委托给另一个生成器、获取完全限定的类名、指定仅关键字参数、解包可变长度迭代器但单独捕获最后一个值,或者任何其他在 3.0 中微不足道的事情时。 x 但在 2.x 中很痛苦,值得重新问自己是否该升级了。
而不是创建一个任意列表,您可以使用内置的*args
和类似的**kwargs
东西
def f(**kwargs):
kwargs['start'] = kwargs.get('start', 0)
def g():
kwargs['start'] += 1
return kwargs['start']
return g
它本质上是相同的“黑客”,这只是不那么丑陋的 imo。