Как использовать переменные класса для инициализации других переменных класса?
class A:
a = 42
b = list(a for _ in range(1))
Почему этот код не работает?
NameError: name 'a' is not defined
Ответы (2 шт):
Автор решения: Aleksandr Fetisov
→ Ссылка
Можно использовать отложенное вычисление (lazy evaluation) с помощью лямбда-функции, которая будет возвращать значение a при вызове
class A:
a = 42
b = [lambda: A.a for _ in range(1)]
Автор решения: CrazyElf
→ Ссылка
Объяснение там довольно сложное, но можно сделать через лямбду (не совсем так, как в другом ответе):
class A:
a = 42
b = (lambda a=a:[a for _ in range(1)])()
print(a, b)
Вывод:
42 [42]
Если коротко, то у списковых, генераторных и прочих сокращений своя область видимости, там уже не работает умолчание, что a - это на самом деле A.a. При этом на A.a там тоже нельзя сослаться, поскольку класс A ещё в процессе определения. Но можно "пробросить" переменную через анонимную функцию lambda и тут же выполнить эту функцию.