`del`语句和自由变量

时间:2015-09-25 17:43:01

标签: python python-3.x closures free-variable

今天测试一些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语句删除deldel实际执行的操作是删除名称' s(N)值,并将其保持为封闭范围?

  

A)这就是为什么它会引发:NameError: free variable 'N' referenced before assignment...而不是NameError: global name 'N' is not defined

     

B) del如何删除名称?它是否解除了它的价值并将其保留在范围内?

我发现了一个类似的案例here

1 个答案:

答案 0 :(得分:1)

它的工作原理如下:当您在print(N)内写y但未在N中分配y时,这意味着当时y定义后,Python在其封闭范围内查找最近的名称N的范围。 N的分配是在y的定义之前还是之后发生,或者是否稍后使用del撤消无关紧要;它只查找最近的封闭范围,其中存在N的赋值。在这种情况下,由于在N内分配了xy基本上会做一点说“当我需要N时,我会查看x的范围{1}}”。

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