2013-11-09 152 views
1

此代碼訪問函數的局部變量

def reportRealDiagnostics(): 

     ranks = 0 
     class Rank: 
      def __init__(self): 
       global ranks 
       ranks += 1 
     rank = Rank() 

reportRealDiagnostics() 

產生

NameError: global name 'ranks' is not defined 

我相信這是所有你需要回答的問題是什麼。

回答

3

當您使用global ranks它看起來ranks在全球範圍內不是封閉的範圍,所以你得到這個錯誤。您定義的ranks是封閉範圍的一部分。

在Python3這已經得到解決,您可以通過使用nonlocal關鍵字修改ranks

def reportRealDiagnostics(): 
     ranks = 0 
     class Rank: 
      def __init__(self): 
       nonlocal ranks 
       ranks += 1 
     rank = Rank() 

reportRealDiagnostics() 

在Python2,你可以將其定義爲功能屬性:

def reportRealDiagnostics(): 
     class Rank: 
      def __init__(self): 
       reportRealDiagnostics.ranks += 1 
     rank = Rank() 
reportRealDiagnostics.ranks = 0 
reportRealDiagnostics() 

有也有一些其他的選擇:nonlocal keyword in Python 2.x

+0

它是導入螞蟻要記住第二個選項在語義上不相同。它將'ranking'放在全局範圍內,它只是隱藏在函數的名稱空間中。 reportRealDiagnostics的多次調用將使用相同的變量。它仍然可以。 – Evan

+0

有一個更嚴重的問題,而不是全球範圍與Python 2.x.問題在於你必須在調用函數之前每次初始化函數局部變量。**這打破了擁有局部變量的整個想法。 – Val

+0

@Val如果你在談論[this](http://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has -a值),那麼這不是與py2.x相關的問題,它在py3.x中的作用也類似。我也不會把它稱爲一個問題。 –

0

您應該使用變量作爲外地:

nonlocal ranks