繁体   English   中英

为什么 copy.deepcopy() 对于元组和列表的行为不同?

[英]Why does copy.deepcopy() behave differently for tuples than lists?

我对深拷贝的理解是,它们将对对象的引用替换为新对象的副本。 然后,

考虑一下:

>>> o = [1, 2, 3]
>>> l = [o]
>>> c = deepcopy(l)
>>> c[0] is l[0]
False

与此相比:

>>> o = (1, 2, 3)
>>> l = [o]
>>> c = deepcopy(l)
>>> c[0] is l[0]
True

为什么行为不同?

deepcopy对于不可变对象来说是多余的,因为没有实用的方法来区分副本和原始对象。 是的,您可以使用isid() ,但这些并不能告诉您很多关于 object 本身的信息。

tuple是不可变的,只要它包含的所有元素都是不可变的。 数字和字符串是不可变的,因此它们是很好的元组成员。 list永远不会是不可变的。

一个 class 可以实现一个方法__deepcopy__ ,如果它实现了,那么 function 将被调用来制作副本。 function 可能会返回原始 object 或新的 object,具体取决于 class 的属性。

正如 John Gordon 在评论中指出的那样,这与 deepcopy 无关。 看起来您的 Python 实现将相同的 object 重复用于相等的文字元组,无论它们出现在何处。 如:

a = (1, 2, 3)
b = (1, 2, 3)
a is b  # True

这是您不能依赖的实现细节。 在最常见的 CPython 实现中,该行用于评估为False 没有人保证它明年不会再次返回False 我将其插入依赖于 Skulpt 实现的在线解释器,它也返回 False (code)

只需使用==进行比较!

为什么 CPython 将相等的元组存储在相同的 memory 位置? 我只能推测,但它可能是为了保存 memory。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM