今天测试了一些Python代码,我尝试了以下代码:
(以下是在Python3.2+上运行的,尽管以前的版本在使用SyntaxError时会引发del,并且在封闭作用域中引用变量)

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

如您所见,Python不会引发NameError: global name 'N' is not defined,这让我想知道一件事:
del语句与函数的封闭作用域一起使用以删除嵌套函数(如y函数)中使用的自由变量时,如果在我们的示例中,该自由变量是通过封闭作用域中的N语句删除的,则del实际做的是删除名称的(del)值并将其绑定到封闭范围?
A)这就是它产生的原因:N而不是NameError: free variable 'N' referenced before assignment...
B)如何实际删除名称?它是否解除了价值绑定并将其保持在一个范围内?
我发现了一个类似的案例here

最佳答案

它的工作方式如下:当您在print(N)中写入y但不在N中分配给y时,这意味着在定义y时,Python会在其封闭作用域中查找最近的一个名称N的分配位置。分配给N是否发生在y的定义之前或之后,或者它是否后来被一个del >取消,它只是寻找最近的封闭范围,其中赋值给N。在这种情况下,由于N是在x内部分配的,因此y本质上做了一个小注释,表示“当我需要N时,我将查看x的范围”。
因此,当您真正调用y时,它会在N的范围内查找x。如果它不在那里,你就会得到错误。请注意,如果在调用del之后移动N = 100行,则在不y的情况下会出现相同的错误。

关于python - del语句和自由变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32787816/

10-12 12:16
查看更多