今天测试一些Python代码我尝试了以下代码:
(以下在Python 3.2+上运行,虽然在使用(force-output *query-io*)
并且在封闭范围内引用变量时,先前版本将引发SyntaxError
del
正如您所看到的,Python不会引发def x():
N = 200
def y():
print(N)
del N
y()
x()
NameError: free variable 'N' referenced before assignment in enclosing scope
,这让我想到了一件事:
当NameError: global name 'N' is not defined
语句与函数的封闭范围一起使用时删除在del
这样的嵌套函数中使用的自由变量,此后如果在我们的情况下是自由变量y
已通过封闭范围内的N
语句删除del
,del
实际执行的操作是删除名称' s(N
)值,并将其保持为封闭范围?
A)这就是为什么它会引发:
NameError: free variable 'N' referenced before assignment...
而不是NameError: global name 'N' is not defined
?B)
del
如何删除名称?它是否解除了它的价值并将其保留在范围内?
我发现了一个类似的案例here
答案 0 :(得分:1)
它的工作原理如下:当您在print(N)
内写y
但未在N
中分配y
时,这意味着当时y
定义后,Python在其封闭范围内查找最近的名称N
的范围。 N
的分配是在y
的定义之前还是之后发生,或者是否稍后使用del
撤消无关紧要;它只查找最近的封闭范围,其中存在N
的赋值。在这种情况下,由于在N
内分配了x
,y
基本上会做一点说“当我需要N
时,我会查看x
的范围{1}}”。
因此,当您实际致电y
时,它会在N
范围内查找x
。如果它不存在,则会出现错误。请注意,如果您在调用del
后移动N = 100
行,则会在没有y
的情况下收到同样的错误。