在实际代码中如何出现“NameError:在封闭范围内赋值之前引用的自由变量'var'”?

2023-11-23

当我闲逛时Python聊天室,有人顺便报告了以下异常:

NameError: free variable 'var' referenced before assignment in enclosing scope

我以前从未见过该错误消息,并且用户只提供了一个小代码片段,该片段本身不会导致错误,所以我去谷歌搜索信息,并且......似乎没有太多信息。当我搜索时,用户报告他们的问题已解决为“空白问题”,然后离开了房间。

经过一番尝试后,我只能使用如下的玩具代码重现异常:

def multiplier(n):
    def multiply(x):
        return x * n
    del n
    return multiply

这给了我:

>>> triple = multiplier(3)
>>> triple(5)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in multiply
NameError: free variable 'n' referenced before assignment in enclosing scope

一切都很好,但是我很难弄清楚这个异常是如何在野外发生的,因为我上面的例子是

  1. 相当愚蠢
  2. 不太可能偶然发生

...但鉴于我在这个问题开始时提到的报告,显然确实如此。

又怎样can这个特定的异常发生在真实的代码中吗?


考虑一个更复杂的函数,其中n是否受约束取决于某些条件。你不必del如果编译器看到一个赋值,也会发生这种情况,因此该名称是本地的,但不会采用代码路径,并且该名称从未被分配任何内容。另一个愚蠢的例子:

def f():
    def g(x):
        return x * n
    if False:
        n = 10
    return g
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在实际代码中如何出现“NameError:在封闭范围内赋值之前引用的自由变量'var'”? 的相关文章

随机推荐