То, что вы делаете здесь, это не просто создание переменной класса. В Python переменные, определенные в теле класса, приводят как к переменной класса («MyClass.mylist»), так и к переменной экземпляра («a.mylist»). Это отдельные переменные, а не просто разные имена для одной переменной.
Однако, когда переменная инициализируется таким образом, начальное значение оценивается только один раз и передается переменным каждого экземпляра. Это означает, что в вашем коде переменная mylist каждого экземпляра MyClass ссылается на один объект списка.
Разница между списком и числом в этом случае заключается в том, что, как и в Java, примитивные значения, такие как числа, копируются при передаче из одной переменной в другую. Это приводит к поведению, которое вы видите; даже если инициализация переменной оценивается только один раз, 0 копируется, когда она передается в переменную каждого экземпляра. Как объект, однако, список не имеет такой вещи, поэтому все ваши вызовы append () поступают из одного и того же списка. Попробуйте вместо этого:
class MyClass():
def __init__(self):
self.mylist = ["Hey"]
self.mynum = 1
Это приведет к тому, что значение будет оцениваться отдельно при каждом создании экземпляра. Очень сильно в отличие от Java, вам не нужны объявления тела класса для сопровождения этого фрагмента; присваивания в __init __ () служат всем необходимым объявлением.