今天测试了一些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/