为什么分配相同的值时,不要元组得到相同的ID?(Why don't tuples get t

2019-10-28 13:00发布

当我执行以下步骤,包括元组( ab )当我重新分配较旧的值甚至还没有保留其原始ID( (1,2)

>>> a , b = (1,2) , (1,2)
>>> a
(1, 2)
>>> b
(1, 2)
>>> id(a) , id(b)
(80131912, 91541064)
>>> a , b = (3,4) , (3,4)
>>> a
(3, 4)
>>> b
(3, 4)
>>> id(a) , id(b)
(91559048, 91689032)
>>> a , b = (1,2) , (1,2)
>>> a
(1, 2)
>>> b
(1, 2)
>>> id(a) , id(b)
(91556616, 91550408)

但在以下情况下,双方都得到了自己年龄大的ID后面。

>>> a = (1,2)
>>> b = (1,2)
>>> a , b
((1, 2), (1, 2))
>>> id(a)
88264264
>>> id(b)
88283400
>>> a = (3,4)
>>> b = (3,4)
>>> id(a)
88280008
>>> id(b)
88264328
>>> a = (1,2)
>>> b = (1,2)
>>> id(a)
88264264
>>> id(b)
88283400
>>> a , b
((1, 2), (1, 2))
>>> id(a) , id(b)
(88264264, 88283400)

可有人请解释一下吗?

Answer 1:

你创造了新的记录对象。 他们具有相同的内容,并不意味着他们会在内存中完全相同的元组对象。

不变性并不意味着创建相同的会产生相同的对象 。 你永远不会突变老(1, 2)元组,以及新的(1, 2)元组是不可变的要么。

CPython的不守重复使用的元组对象的缓存(所以它没有创建新的对象的时候,Python的做了许多小的元组的一个典型的程序中),但是这是一个实现细节,你不能依靠上。 正是这种高速缓存是再次被人看到相同的ID,长度为两元组的原因。 请参阅如何元组CPython的实现? 如果你想知道缓存是如何实现的。

此外,在CPython的, id()是对象的存储位置,和Python是免费的,一旦老物件已被释放到再利用的存储位置。 这是明确记载 :

这是保证是用于在其寿命期间该对象独特和恒定的整数。 与非重叠-寿命两个对象可以具有相同的id()值。

它总是可以看到相同的id()新对象的价值。 有时,这意味着你仍然有相同的对象(如对于小整数或元组或某些类型的字符串对象的情况下),有时它只是解释再利用内存中的相同位置。 你永远不应该依赖这个,这些都是提高性能的目的,并随时更改,实现细节。



文章来源: Why don't tuples get the same ID when assigned the same values?