Доступ к локальной функции-переменной

Этот код

def reportRealDiagnostics():

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

reportRealDiagnostics()

производит

NameError: global name 'ranks' is not defined

Я уверен, что это все, что вам нужно, чтобы ответить на вопрос.

2 ответа

Решение

Когда вы используете 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 ключевое слово в Python 2.x

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

nonlocal ranks
Другие вопросы по тегам