[英]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
对于不可变对象来说是多余的,因为没有实用的方法来区分副本和原始对象。 是的,您可以使用is
或id()
,但这些并不能告诉您很多关于 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.