2013-11-09 51 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