今天测试一些Python代码我尝试了以下代码:
(以下内容在 Python 3.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
,这让我想知道一件事:
when
del
语句在函数的封闭范围内使用,以删除在嵌套函数(如 y
函数)中使用的自由变量,以及此后如果我们案例中的自由变量 N
是通过 del
语句删除的在封闭范围内, del
实际上所做的是删除名称的 (N
) 值并保持其绑定到封闭范围?
A) 这就是它升高的原因:
而不是NameError: free variable 'N' referenced before assignment...
?NameError: global name 'N' is not defined
B)
实际上如何删除名称?它是否解除了它的值的绑定并将其保留在一个范围内?del
我发现了类似的案例这里
它的工作原理是这样的:当你在
print(N)
中写入 y
但不分配给 N
中的 y
时,这意味着在定义 y
时,Python 会在其封闭范围中查找以查找最近的一个分配了名称 N
的位置。 对 N
的赋值发生在 y
定义之前还是之后,或者稍后是否用 del
撤消都无关紧要;它只是查找最近的封闭范围,其中存在对 N
的赋值。 在这种情况下,由于 N
被分配在 x
内部,y
本质上做了一个小注释,说“当我需要获得 N
时,我会在 x
的范围内查找”。
所以当你实际调用
y
时,它会在N
的范围内寻找x
。 如果它不存在,您会收到错误。 请注意,如果在调用 del
之后移动 N = 100
行,则在没有 y
的情况下也会出现同样的错误。