1
>>> def QQ():
...     a = 0
...     def QQQ():
...         global a
...         a += 1
...     QQQ()
...
>>> QQ()
NameError: global name 'a' is not defined

在这种情况下似乎global不起作用。除了 1 元素列表技巧,我还能做什么?

4

2 回答 2

3

如果您使用的是 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 中很痛苦,值得重新问自己是否该升级了。

于 2013-06-22T00:15:39.990 回答
0

而不是创建一个任意列表,您可以使用内置的*args和类似的**kwargs东西

def f(**kwargs):
    kwargs['start'] = kwargs.get('start', 0)
    def g():
        kwargs['start'] += 1
        return kwargs['start']
    return g

它本质上是相同的“黑客”,这只是不那么丑陋的 imo。

于 2013-06-22T00:44:17.513 回答