Python 为什么元组在分配相同的值时不能获得相同的ID?

Python 为什么元组在分配相同的值时不能获得相同的ID?,python,tuples,immutability,python-internals,Python,Tuples,Immutability,Python Internals,当我执行以下步骤时,元组a和b都没有保留其原始ID,即使我重新分配了旧值1,2 但在接下来的案例中,两人都拿回了他们的旧身份证 >>> a = (1,2) >>> b = (1,2) >>> a , b ((1, 2), (1, 2)) >>> id(a) 88264264 >>> id(b) 88283400 >>> a = (3,4) >>> b = (3,4) &g

当我执行以下步骤时,元组a和b都没有保留其原始ID,即使我重新分配了旧值1,2

但在接下来的案例中,两人都拿回了他们的旧身份证

>>> 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)

有人能解释一下吗?

您创建了新的元组对象。它们具有相同的内容并不意味着它们在内存中是完全相同的元组对象

不变性并不意味着创建相同的值将创建相同的对象。您从未对旧的1,2元组进行过变异,而新的1,2元组也不可变

CPython确实保留了一个可重用元组对象的缓存,因此它不必一直创建新的对象。Python在一个典型的程序中经历了很多小元组,但这是一个您不能依赖的实现细节。对于长度为2的元组,同样的ID再次出现的原因就是这个缓存。看看您是否想知道缓存是如何实现的

此外,在CPython中,id是对象的内存位置,一旦旧对象被释放,Python就可以自由地重用内存位置。这是:

这是一个整数,保证该对象在其生存期内唯一且恒定。两个生命周期不重叠的对象可能具有相同的id值


对于新对象,始终可以看到相同的id值。有时这意味着您仍然拥有与小整数、元组或某些类型的字符串对象相同的对象,有时只是解释器在内存中重复使用了相同的位置。您永远不应该依赖于此,这些是用于性能目的的实现细节,可能会发生更改。

您创建了新的元组对象。它们具有相同的内容并不意味着它们在内存中是完全相同的元组对象

不变性并不意味着创建相同的值将创建相同的对象。您从未对旧的1,2元组进行过变异,而新的1,2元组也不可变

CPython确实保留了一个可重用元组对象的缓存,因此它不必一直创建新的对象。Python在一个典型的程序中经历了很多小元组,但这是一个您不能依赖的实现细节。对于长度为2的元组,同样的ID再次出现的原因就是这个缓存。看看您是否想知道缓存是如何实现的

此外,在CPython中,id是对象的内存位置,一旦旧对象被释放,Python就可以自由地重用内存位置。这是:

这是一个整数,保证该对象在其生存期内唯一且恒定。两个生命周期不重叠的对象可能具有相同的id值

对于新对象,始终可以看到相同的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)