python.org. name bindingMaximus.Ziro
Или просто: почему так происходит?
a и b - это просто имена, привязанные к одному и тому же объекту. Когда ты делаешь b = a , с именами ничего не происходит, просто имя b привязывается к тому объекту, который получен через имя a, которое тоже к нему привязано. Так у тебя появляются два имени и один объект.
a = 1 # привязал имя a к объекту 1
b = a # привязал имя b к объекту, к которому привязано имя a, - к объекту 1
a = 2 # привязал имя a к объекту 2
То есть если ты привязал имя к другому объекту, то от первого оно отвязывается. К друг другу имена не привязываются и не отвязываются. Имена можно только к объектам привязывать.
a = [] # привязал имя a к объекту []
b = a # привязал имя b к объекту, к которому привязано имя a, - к объекту []
a.append(3) # взял объект, к которому привязано имя a, и вызвал у него метод append()
Так как метод append() меняет сам объект, с именами здесь никаких изменений не происходит, они остаются привязаны так же, как и были. А вот сам объект меняется. Так как имя a и имя b привязаны к одному и тому же объекту, то как через имя a, так и через имя b ты можешь получить только этот один объект. Поэтому, когда ты вызываешь append() у объекта, ты его получаешь через имя a, а когда выводишь его через print, ты получает тот же самый объект, но через имя b.