【发布时间】:2015-01-27 18:34:51
【问题描述】:
不明白copy.deepcopy为什么不修改对象的id:
import copy
a = 'hello world'
print a is copy.deepcopy(a) # => True ???
【问题讨论】:
-
如果您希望该测试有意义,请选择一个可变对象——不是字符串或仅包含不可变对象的元组。
不明白copy.deepcopy为什么不修改对象的id:
import copy
a = 'hello world'
print a is copy.deepcopy(a) # => True ???
【问题讨论】:
Simeon 的回答完全正确,但我想提供一个更笼统的观点。
copy 模块主要用于可变 对象。这个想法是制作一个对象的副本,以便您可以在不影响原始对象的情况下对其进行修改。由于制作不可变对象的副本没有意义,因此该模块拒绝这样做。字符串在 Python 中是不可变的,因此这种优化永远不会影响实际代码。
【讨论】:
Python interns 字符串,所以它们是同一个对象(因此与 is 相比是相同的)。这意味着 Python 只存储同一个字符串对象的一份副本(在幕后)。
copy.deepcopy(a) 的结果并不是真正的新对象,因此对字符串对象执行此调用没有意义。
【讨论】:
deepcopy 也不会为元组创建新对象,它们也不是 intern。
再看一遍:
import copy
a = ['hello world']
print a is copy.deepcopy(a) # => False
由于不可变对象(例如字符串)的值在不改变其标识的情况下无法改变,因此创建额外的实例是没有意义的。只有在可变对象(例如列表)的情况下,才需要创建具有相同值的第二个身份。
关于分离价值、身份和状态的概念的全面介绍,我建议Rich Hickey's talk on the subject。
【讨论】: