gpt4 book ai didi

python - `del` 语句和自由变量

转载 作者:行者123 更新时间:2023-11-28 18:35:30 26 4
gpt4 key购买 nike

今天测试一些 Python 代码,我尝试了以下代码:

(以下运行在 Python 3.2+ 上,尽管以前的版本在使用 del 并且在封闭范围内引用变量时会引发 SyntaxError)

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) 值并将其绑定(bind)到封闭范围?

A) Is that why it raises: NameError: free variable 'N' referenced before assignment... rather than NameError: global name 'N' is not defined?

B) How does del actually delete a name? Does it unbind its value and keep it in a scope ?

我找到了一个类似的案例here

最佳答案

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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com