当我在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
一切都很好,但我很难弄清楚这个异常是如何在野外发生的,因为我上面的例子是
- 相当愚蠢
- 不可能偶然发生
...但显然它确实如此,鉴于我在这个问题开始时提到的报告。
那么 -这个特定的异常如何在实际代码中发生?