如何在外部函数中重新绑定名称?

2024-03-28 08:27:35 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: name元素列表技巧isdefnot情况
2条回答

如果您使用的是Python3.x,那么可以使用^{}

>>> def QQ():
...     a = 0
...     def QQQ():
...         nonlocal a
...         a += 1
...     QQQ()
...     return a
...
>>> QQ()
1

如果您使用的是Python2.x,那么就不能这么做。这就是添加nonlocal的原因。因此,您必须使用某种可变包装器,如1元素列表技巧。*

PEP 3104解释了所有棘手的细节(包括为什么Python在默认情况下不执行“经典静态嵌套作用域”,并要求您对此进行明确说明)。你知道吗


*当然,也可以升级到3.x版本。每当您发现自己在问如何绑定到非局部变量、委托到另一个生成器、获取完全限定的类名、指定只包含关键字的参数、解包一个可变长度的迭代器但分别捕获最后一个值,或者其他任何在3.x中很琐碎但在2.x中却很痛苦的问题时,都值得再次问自己是否该升级了。你知道吗

您可以使用内置的*args**kwargs之类的

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

这基本上是同一个“黑客”,只是不那么难看

相关问题 更多 >