2014-07-11 24 views
6

當我在Python chatroom掛出來,有人在下降,報告了以下異常:如何「NameError:在封閉範圍內賦值之前引用的自由變量'var'出現在真實代碼中?

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. 不太可能在事故

發生......但很顯然你,因爲我在這個問題開始提到的報告。

那麼 - 如何可以這個特定的異常發生在真實的代碼?

+7

Somebody incompetent writes that code for real? – iCodez

+0

這曾經是Python 2中的編譯時錯誤,看起來像是在Python 3中改變了。 –

+0

@undefinedisnotafunction:它不是Python 2中的編譯時錯誤。它不能像編譯器不做的那樣花式靜態分析控制流量。 – BlackJack

回答

5

想象一個更復雜的函數,其中n根據某些條件而定,或者不是。你不需要del這個名字,如果編譯器看到一個賦值,它也會發生,所以這個名字是本地的,但是代碼路徑沒有被使用,並且這個名字從來沒有被分配過任何東西。另一個愚蠢的例子:

def f(): 
    def g(x): 
     return x * n 
    if False: 
     n = 10 
    return g 
相關問題