2024-03-28 08:27:35 发布
网友
>>> def QQ(): ... a = 0 ... def QQQ(): ... global a ... a += 1 ... QQQ() ... >>> QQ() NameError: global name 'a' is not defined
在这种情况下,global似乎不起作用。除了1元素列表技巧,我还能做什么?你知道吗
global
如果您使用的是Python3.x,那么可以使用^{}:
>>> def QQ(): ... a = 0 ... def QQQ(): ... nonlocal a ... a += 1 ... QQQ() ... return a ... >>> QQ() 1
如果您使用的是Python2.x,那么就不能这么做。这就是添加nonlocal的原因。因此,您必须使用某种可变包装器,如1元素列表技巧。*
nonlocal
PEP 3104解释了所有棘手的细节(包括为什么Python在默认情况下不执行“经典静态嵌套作用域”,并要求您对此进行明确说明)。你知道吗
*当然,也可以升级到3.x版本。每当您发现自己在问如何绑定到非局部变量、委托到另一个生成器、获取完全限定的类名、指定只包含关键字的参数、解包一个可变长度的迭代器但分别捕获最后一个值,或者其他任何在3.x中很琐碎但在2.x中却很痛苦的问题时,都值得再次问自己是否该升级了。你知道吗
您可以使用内置的*args和**kwargs之类的
*args
**kwargs
def f(**kwargs): kwargs['start'] = kwargs.get('start', 0) def g(): kwargs['start'] += 1 return kwargs['start'] return g
这基本上是同一个“黑客”,只是不那么难看
如果您使用的是Python3.x,那么可以使用^{} :
如果您使用的是Python2.x,那么就不能这么做。这就是添加
nonlocal
的原因。因此,您必须使用某种可变包装器,如1元素列表技巧。*PEP 3104解释了所有棘手的细节(包括为什么Python在默认情况下不执行“经典静态嵌套作用域”,并要求您对此进行明确说明)。你知道吗
*当然,也可以升级到3.x版本。每当您发现自己在问如何绑定到非局部变量、委托到另一个生成器、获取完全限定的类名、指定只包含关键字的参数、解包一个可变长度的迭代器但分别捕获最后一个值,或者其他任何在3.x中很琐碎但在2.x中却很痛苦的问题时,都值得再次问自己是否该升级了。你知道吗
您可以使用内置的
*args
和**kwargs
之类的这基本上是同一个“黑客”,只是不那么难看
相关问题 更多 >
编程相关推荐