为什么copy.deepcopy不修改对象的id?

时间:2015-01-27 18:34:51

标签: python deep-copy

我不明白为什么copy.deepcopy不会修改对象的ID:

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

3 个答案:

答案 0 :(得分:6)

Python interns字符串,因此它们是同一个对象(因此与is相比时相同)。这意味着Python只存储同一个字符串对象的一个​​副本(在幕后)。

copy.deepcopy(a)的结果并不是真正的新对象,因此对字符串对象执行此调用没有意义。

答案 1 :(得分:5)

Simeon的答案是完全正确的,但我想提供更一般的观点。

copy模块主要用于可变对象。我们的想法是制作一个对象的副本,以便您可以在不影响原始对象的情况下对其进行修改。由于制作不可变对象的副本毫无意义,因此该模块拒绝这样做。字符串在Python中是不可变的,因此这种优化永远不会影响实际代码。

答案 2 :(得分:2)

再看一遍:

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

由于不可变对象(例如字符串)的值在不改变其身份的情况下无法改变,因此创建其他实例是没有意义的。只有在可变对象(例如列表)的情况下,才能创建具有相同值的第二个标识。

为了全面介绍如何分离价值,身份和国家的概念,我建议Rich Hickey's talk on the subject