2013-11-09 2 views

ответ

3

При использовании global ranks он ищет ranks в глобальном масштабе не в области видимости, так что вы получите эту ошибку. Определенный вами ranks является частью охватывающей области.

В Python3 это была решена, и вы можете изменить ranks с помощью nonlocal ключевого слова:

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

Это импорт ant помнить, что второй вариант не семантически то же самое. Он помещает 'ряды' в глобальную область, он просто скрывается в пространстве имен функции. Множественные вызовы reportRealDiagnostics будут использовать одну и ту же переменную. Все еще может быть в порядке. – Evan

+0

Существует более серьезная проблема, чем просто глобальная область действия с python 2.x. Проблема в том, что ** вы должны каждый раз инициализировать функционально-локальные переменные перед вызовом функции. ** Это побеждает всю идею наличия локальных переменных. – Val

+0

@Val Если вы говорите об этом [http://docs.python.org/2/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has -a-value), то это не проблема, связанная с py2.x, она аналогично работает и в py3.x. Я бы тоже не назвал это проблемой. –

0

Вы должны использовать переменную нелокальной:

nonlocal ranks 
Смежные вопросы