AKS*_*MAR 1 python tuples immutability python-internals
当我执行以下步骤时,即使重新分配旧值(),两个元组(a和b)也都没有保留其原始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)
Run Code Online (Sandbox Code Playgroud)
但是在下面的例子中,两者都得到了旧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)
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗?
您创建了新的元组对象.它们具有相同的内容并不意味着它们将是内存中完全相同的元组对象.
不变性并不意味着创建相同的值将创建相同的对象.你永远不会改变旧的(1, 2)元组,你的(1, 2)新元组也不可变.
CPython确实保留了可重用的元组对象的缓存(因此它不必一直创建新对象,Python在典型程序中经历了很多小元组),但这是一个你不能依赖的实现细节上.对于长度为2的元组,正是这个缓存是再次看到相同ID的原因.请参阅如何在CPython中实现元组?如果你想知道如何实现缓存.
此外,在CPython中,id()是对象的内存位置,一旦释放旧对象,Python可以自由地重用内存位置.这清楚地记录在案:
这是一个整数,在该生命周期内保证该对象是唯一且恒定的.具有非重叠寿命的两个对象可以具有相同的
id()值.
始终可以看到id()新对象的相同值.有时这意味着你仍然拥有相同的对象(如小整数或元组或某些类型的字符串对象的情况),有时只是解释器在内存中重复使用相同的位置.您永远不应该依赖于此,这些是用于性能目的的实现细节,并且可能会发生变化.
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |