1

我在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”的情况下工作。我的理解是它是一个闭包,内部函数将保持对外部(自由)变量的引用,并且每当调用内部函数时,它将能够对该封闭变量采取行动,但我当然没有正确理解它的某些部分. 请帮助我清除我缺少的概念。谢谢所有回答的人。所以太有帮助了。

4

1 回答 1

2

当我在封闭函数中使用“nonlocal x”时,它可以工作,但是初始代码如何在没有“nonlocal”的情况下工作。

在第一个片段中,您正在改变现有kwargs值。您没有为它或任何其他名称分配新值。

但在第二个片段中,您将新值分配给x. 这迫使x本地化(除非您另有说明)。因此,您x+1是对尚未分配的局部变量的引用。因此错误。

有关更严格的解释,请阅读文档中的命名和绑定。相关位是:

程序文本中每次出现的名称都是指在包含使用...的最内层功能块中建立的该名称的绑定...</p>

在代码块中使用名称时,将使用最近的封闭范围来解析它……</p>

如果名称绑定在块中,则它是该块的局部变量,除非声明为nonlocal...</p>

要了解其背后的工作原理,您还需要阅读标准类型层次结构中的函数和代码对象。您可能不需要知道该部分来理解,但对于调试,您可能需要检查 the__closure__和其他属性。

于 2013-04-13T00:28:30.200 回答