python如何为不可变对象分配ID?

时间:2019-01-29 19:40:23

标签: python

我正在阅读Slicing a list in Python without generating a copy的答案。答案使用

>>> a = [1000 + 1, 1000 + 1, 1000 + 1]
>>> map(id, a)
[140502922988976, 140502922988952, 140502922988928]

证明每个整数在a中都有唯一的ID。

作为一个健全性检查,我在自己的环境中运行了以下代码(我在python3上运行,因此必须在list上调用map

> a = [1+1, 1+1, 1+1]
> list(map(id,a))
[140228695033632, 140228695033632, 140228695033632]

我所做的只是将1000更改为1,现在python为每个数字分配了相同的ID!我还使用1000运行了原始代码,该代码给出了三个不同的ID。为什么不同大小的整数的行为不同?

我还想和其他一些不可变的东西玩耍。

组始终获得不同的ID。

> a = [(1,), (1,), (1,)]
> list(map(id,a))
[140228631126592, 140228631112728, 140228631128944]

简单的字符串具有相同的ID。

> a = ['a', 'a', 'a']
> list(map(id,a))
[140068125361128, 140068125361128, 140068125361128]

更长的字符串具有不同的ID。

> a = ['a'*1000, 'a'*1000, 'a'*1000]
> list(map(id,a))
[17589280, 17579408, 17580480]

我还调查了它是否特定于列表:

> a, b = 1+1, 1+1
> a is b
True
> a, b = 1000+1, 1000+1
> a is b
False

这是怎么回事?

0 个答案:

没有答案