id()何时产生10或15位数?

时间:2018-01-12 18:58:22

标签: python

我已经意识到在某些情况下(python和type的版本)id内置函数产生的是15位数,而不是大多数看到的10位数。我想知道文件提到的时间是否可能很长,但事实并非如此

  

id:返回对象的“标识”。这是一个整数 (或长整数),保证在此生命周期内该对象具有唯一性和常量。具有非重叠生存期的两个对象可能具有相同的id()值。

这是我尝试过的:

Python 2.7.5 - GCC 4.8.3 Linux 2

>>> print(id(3))
18705464
>>> print(id('2'))
139621043310840

Python

Python 2.7.14 - GCC 4.2.1兼容的Apple LLVM 9.0.0

>>> print(id('1'))
4318307312
>>> print(id(1))
140699106326584

正如您所看到的,在两个操作系统上的两个不同的次要版本中,我的行为略有不同。在一种情况下,str对象在另一种情况下产生15位数int。在Python 3中我无法重现它,它们都是10位数。

1 个答案:

答案 0 :(得分:1)

这些数字完全取决于操作系统分配给Python的内存区域,不应被视为不透明的其他内容。

来自documentation for id()

  

CPython实现细节:这是内存中对象的地址。

implementation of the function只是将指针转换为long:

static PyObject *
builtin_id(PyObject *self, PyObject *v)
{
    return PyLong_FromVoidPtr(v);
}

自Python 1.0以来,基本实现没有改变;自从the first time the function was added以来,在20多年前,这个数字的生成方式没有任何变化(只有C函数调用生成Python整数对象的时间已被重命名)。

使用的位数完全取决于可寻址和可用的内存量,操作系统如何将其分配给Python进程,以及Python进程加载到内存中的对象数量,以及发生了多少内存碎片。例如,32位操作系统可能产生比64位操作系统更低的ID,纯粹是因为后者可以处理更多内存。

你会发现,如果你更频繁地运行你的测试(穿插其他程序启动或退出,以及你的操作系统上的内存负载不同),数字会有很大差异。