【问题标题】:Why copy.deepcopy doesn't modify the id of an object?为什么 copy.deepcopy 不修改对象的 id?
【发布时间】:2015-01-27 18:34:51
【问题描述】:

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

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

【问题讨论】:

  • 如果您希望该测试有意义,请选择一个可变对象——不是字符串或仅包含不可变对象的元组。

标签: python deep-copy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 可能更准确地说“不是真正的新对象当原始对象不可变时”。
    • Interning 不是 这背后的原因,因为 deepcopy 也不会为元组创建新对象,它们也不是 intern。
    【解决方案3】:

    再看一遍:

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

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

    关于分离价值、身份和状态的概念的全面介绍,我建议Rich Hickey's talk on the subject

    【讨论】:

      猜你喜欢
      • 2013-11-13
      • 1970-01-01
      • 2013-07-15
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多