2015-01-27 1 views
1

Я не понимаю, почему copy.deepcopy не изменяет идентификатор объекта:Почему copy.deepcopy не изменяет идентификатор объекта?

import copy 
a = 'hello world' 
print a is copy.deepcopy(a) # => True ??? 
+3

Выберите изменяемый объект - не строку или кортеж, содержащий только неизменяемые объекты - если вы хотите, чтобы этот тест имел смысл. –

ответ

4

Ответ Симеона совершенно верный, но я хотел представить более общую перспективу.

Модуль copy предназначен в основном для использования с изменчивым объектами. Идея состоит в том, чтобы сделать копию объекта, чтобы вы могли изменить его, не затрагивая оригинал. Поскольку нет смысла создавать копии неизменяемых объектов, модуль отказывается это делать. Строки неизменны в Python, поэтому эта оптимизация никогда не может повлиять на реальный код.

5

Python interns строки, поэтому они и тот же объект (и, таким образом, тот же, по сравнению с is). Это означает, что Python хранит только одну копию одного и того же строкового объекта (за кулисами).

Результат copy.deepcopy(a) не является поистине новым объектом и поэтому не имеет смысла выполнять этот вызов для строкового объекта.

+0

Можете быть более точными, чтобы сказать: «Это не действительно новый объект, когда исходный объект непреложный». –

2

Посмотрите еще:

import copy 
a = ['hello world'] 
print a is copy.deepcopy(a) # => False 

Поскольку значение в immutible объекта (например, строка) не в состоянии изменить, не изменяя его личность, есть не было бы никакого смысла создавать дополнительные экземпляры. Это только в случае изменяемого объекта (например, списка), где есть смысл создать второй идентификатор с тем же значением.

Для подробного введения в разделение понятий ценности, идентичности и состояния я предлагаю Rich Hickey's talk on the subject.