Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2016 15:39:43

Maximus.Ziro
Зарегистрирован: 2016-08-16
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Передача по ссылке/по значению

Добрый день.

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

Заранее большое спасибо.

Офлайн

#2 Авг. 16, 2016 16:04:17

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Передача по ссылке/по значению

mutable-vs-immutable



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Авг. 16, 2016 17:16:56

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Передача по ссылке/по значению

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.



Отредактировано py.user.next (Авг. 16, 2016 17:18:14)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version