`del` 语句和自由变量[重复]

问题描述 投票:0回答:1

今天测试一些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
实际上如何删除名称?它是否解除了它的值的绑定并将其保留在一个范围内?

我发现了类似的案例这里

python python-3.x closures free-variable
1个回答
1
投票

它的工作原理是这样的:当你在

print(N)
中写入
y
但不分配给
N
中的
y
时,这意味着在定义
y
时,Python 会在其封闭范围中查找以查找最近的一个分配了名称
N
的位置。 对
N
的赋值发生在
y
定义之前还是之后,或者稍后是否用
del
撤消都无关紧要;它只是查找最近的封闭范围,其中存在对
N
的赋值。 在这种情况下,由于
N
被分配在
x
内部,
y
本质上做了一个小注释,说“当我需要获得
N
时,我会在
x
的范围内查找”。

所以当你实际调用

y
时,它会在
N
的范围内寻找
x
。 如果它不存在,您会收到错误。 请注意,如果在调用
del
之后移动
N = 100
行,则在没有
y
的情况下也会出现同样的错误。

© www.soinside.com 2019 - 2024. All rights reserved.