Я не понимаю, почему copy.deepcopy
не изменяет идентификатор объекта:Почему copy.deepcopy не изменяет идентификатор объекта?
import copy
a = 'hello world'
print a is copy.deepcopy(a) # => True ???
Я не понимаю, почему copy.deepcopy
не изменяет идентификатор объекта:Почему copy.deepcopy не изменяет идентификатор объекта?
import copy
a = 'hello world'
print a is copy.deepcopy(a) # => True ???
Ответ Симеона совершенно верный, но я хотел представить более общую перспективу.
Модуль copy
предназначен в основном для использования с изменчивым объектами. Идея состоит в том, чтобы сделать копию объекта, чтобы вы могли изменить его, не затрагивая оригинал. Поскольку нет смысла создавать копии неизменяемых объектов, модуль отказывается это делать. Строки неизменны в Python, поэтому эта оптимизация никогда не может повлиять на реальный код.
Python interns строки, поэтому они и тот же объект (и, таким образом, тот же, по сравнению с is
). Это означает, что Python хранит только одну копию одного и того же строкового объекта (за кулисами).
Результат copy.deepcopy(a)
не является поистине новым объектом и поэтому не имеет смысла выполнять этот вызов для строкового объекта.
Можете быть более точными, чтобы сказать: «Это не действительно новый объект, когда исходный объект непреложный». –
Посмотрите еще:
import copy
a = ['hello world']
print a is copy.deepcopy(a) # => False
Поскольку значение в immutible объекта (например, строка) не в состоянии изменить, не изменяя его личность, есть не было бы никакого смысла создавать дополнительные экземпляры. Это только в случае изменяемого объекта (например, списка), где есть смысл создать второй идентификатор с тем же значением.
Для подробного введения в разделение понятий ценности, идентичности и состояния я предлагаю Rich Hickey's talk on the subject.
Выберите изменяемый объект - не строку или кортеж, содержащий только неизменяемые объекты - если вы хотите, чтобы этот тест имел смысл. –