3

今天测试一些Python代码我尝试了以下代码:

(以下在 Python 3.2+ 上运行,尽管以前的版本会引发一个SyntaxErrorwhendel被使用并且一个变量在封闭范围内被引用)

def x():
    N = 200
    def y():
            print(N)
    del N
    y()
x() 
NameError: free variable 'N' referenced before assignment in enclosing scope 

如您所见,Python 不会 raises NameError: global name 'N' is not defined,这让我想知道一件事:

del语句与函数的封闭范围一起使用来删除在嵌套函数中使用的自由变量y时,如果我们的例子中的自由变量N是通过del封闭范围中的语句删除的,那么del实际上是删除名称的( N) 值并将其绑定到封闭范围?

A)这就是它提出的原因:NameError: free variable 'N' referenced before assignment...而不是NameError: global name 'N' is not defined

B)如何del实际删除一个名字?它是否解除了它的价值并将其保持在一个范围内?

我在这里发现了一个类似的案例

4

1 回答 1

1

它的工作原理是这样的:当你写print(N)insidey但不分配到Nin 时y,这意味着在y定义时,Python 会在其封闭范围中查找最近N分配名称的范围。赋值是N发生在 的定义之前还是之后y,或者之后是否用del;撤消都没有关系。它只是寻找存在分配给的最近的封闭范围N。在这种情况下,由于N是在里面赋值xy本质上是做一个小注释说“当我需要获取时N,我会在范围内查找x”。

所以当你实际调用时y,它会Nx. 如果它不存在,则会出现错误。请注意,del如果您N = 100在调用y.

于 2015-09-25T17:56:16.623 回答