Когда вы объявляете переменную с одинаковым именем как внутри, так и вне класса / функции, как вы узнаете, какое значение переменной будет использовано?

a=0
b=1
class A:
    a=42
    b=list((a,a+1,a+2))
x=A()
print(x.b)

выход: [42, 43, 44]

В.С.

a=0
b=1
class A:
    a=42
    b=list((a+i for i in range(3)))
x=A()
print(x.b)

вывод: [0, 1, 2]

Таким образом, в первом примере было использовано a=42. Но во втором примере было использовано a=0. Почему это так?

1 ответ

Хорошо, я нашел это рассуждение на слайдах моего профессора:

"Область имен, определенных в блоке класса, ограничена блоком класса; она не распространяется на блоки кода методов - это включает в себя понимания и выражения генератора, поскольку они реализованы с использованием области действия функции". - Доктор Чжао Ибао

поэтому в примере 2 list((a+i для i в диапазоне (3))) является примером понимания списка. Следовательно, он принимает глобальное пространство имен a=0. Он не распознает a=42, как это было определено в блоке классов, A().

Надеюсь, что кто-то может проверить мои рассуждения, я не уверен, что это совершенно верно.

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