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

Why copy.deepcopy doesn't modify the id of an object?

不明白为什么copy.deepcopy不修改对象的id:

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

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

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

Simeon 的回答完全正确,但我想提供一个更普遍的观点。

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

再看:

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

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

为了彻底介绍分离值、身份和状态的概念,我建议 Rich Hickey's talk on the subject