Найти - Пользователи
Полная версия: Передача по ссылке/по значению
Начало » Python для новичков » Передача по ссылке/по значению
1
Maximus.Ziro
Добрый день.

Изучаю Python, читаю книгу, встретилось мне утверждение о том,
что все в Python является объектами и передача происходит по ссылке,
и пример приводится типа:
a =
b = a
a.append(3)
print b #получаем , т.е. изменили a, автоматически изменился b.
Всё понятно.
Но вот мой контр-пример:
a = 1
b = a
a = 2
print b #получаем 1, т.е. имеем другое поведение.
Я уверен, что это так и задумывалось, вопрос в том:
если я хочу найти описание вот этого поведения, то
Как оно называется?
Какую тему мне необходимо искать в книге?
Или просто: почему так происходит?

Заранее большое спасибо.
terabayt
mutable-vs-immutable
py.user.next
python.org. name binding

Maximus.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.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB