我在http://pydanny.com/python-dictionary-as-a-class.html找到了以下代码。代码工作得很好,我有点理解它为什么但是类似的代码,在它下面会给出错误。
def newclass(**kwargs):
""" Use kwargs.update() method to handle inheritance """
def set(key, value):
""" Sets key/value to the kwargs.
Replicates self/this clumsily
"""
kwargs[key] = value
kwargs['set'] = set
return kwargs
我的试用代码:
def closing():
x=1
def closed():
print(x)
x=x+1
return(closed)
a=closing()
a()
错误讯息:
Traceback (most recent call last):
File "<pyshell#606>", line 1, in <module>
a()
File "<pyshell#604>", line 4, in closed
print(x)
UnboundLocalError: local variable 'x' referenced before assignment
当我在闭合函数中使用'nonlocal x'时它可以工作,但是如果没有'nonlocal',初始代码怎么工作。 我的理解是它是一个闭包,内部函数将保持外部(自由)变量的引用,每当调用内部函数时,它将能够对该闭合变量进行操作,但当然我还没有正确理解它的某些部分。 请帮我清楚我错过的概念。 谢谢所有回答的人。所以太有帮助了。
答案 0 :(得分:2)
当我在封闭函数中使用'nonlocal x'时它可以工作,但是如果没有'nonlocal',初始代码怎么工作。
在第一个代码段中,您正在改变现有的kwargs
值。您没有为其分配新值或任何其他名称。
但是在第二个代码段中,您要为x
分配一个新值。这迫使x
成为当地人(除非你另有说明)。因此,您的x+1
是对尚未分配的本地变量的引用。因此错误。
有关更严格的说明,请阅读文档中的Naming and binding。相关位是:
程序文本中每次出现的名称都是指在包含使用内容的最里面的功能块中建立的名称的绑定...
在代码块中使用名称时,使用最近的封闭范围解析...
如果名称绑定在块中,则它是该块的局部变量,除非声明为
nonlocal
...
要了解其工作原理,您还需要阅读The standard type hierarchy中的函数和代码对象。您可能不需要知道该部分是为了理解,但是对于调试,您可能需要检查__closure__
和其他属性。