self.i, я не догоняю до конца, почему в случае листа, это один и тот же лист, который также через self референсуется, а вслучае i там что то более сложная с возникновением частной переменной.
Вроде последнее предложение прояснило самому себе, типо через оператор += через его = создается как будто бы другая переменная со своим отдельным адресом, если бы посмотреть в виртуальные аддреса переменных ? И через = меняются референсы, так как в питоне у нас все присвоения они условно говоря shallow copy, просто указатель меняется на другую переменную.
А append ровно действует на ровно тот же лист с тем же адресом, как то так мне кажется.
Смотри, есть такая штука как mro — method resolution order. Названа криво, потому что не только про методы, а про любые атрибуты. Она определяет, грубо говоря, с каким объектом мы будем работать при обращении по имени. obj.a будет искать атрибут a сперва в экземпляре, потом в классе, потом в родительских (по хитровывернутому алгоритму). Поэтому обращаясь к self.i ты в разное время можешь получать разное. Пока не присвоил — будет браться из класса. Первое же присвоение — и у экземпляра появляется такой атрибут и затеняет атрибут класса.
но мне кажется, это не до конца объясняет разницу в поведение. например, специально поменял оператор в случае с листом )) результат тот же
Обсуждают сегодня