SyntaxError нелокальный питон в определении метода

Я набираю в интерактивном режиме следующий код:

class A:
    a=42
    def foo():
        nonlocal a

но у меня есть SyntaxError: no binding for nonlocal 'a' found, Но я ожидаю, что результат разрешения nonlocal a будет 42, потому что ближайшая окружающая область для этого метода - блок класса.

2 ответа

Решение

Область видимости класса обрабатывается особым образом Python: при поиске имен в конечных областях области классов пропускаются.

Для доступа к имени из области видимости либо используйте self.a искать через экземпляр или A.a искать через класс.

См . Область имен, определенных в блоке класса, не распространяется на блоки методов. Это почему? для обоснования этого поведения.

То, что вы делаете, это создание class который имеет атрибут класса aсо значением по умолчанию 42, Вы можете обратиться к этому атрибуту A.a, Если вы хотите использовать его в классе, используйте self.a,

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