我已经意识到在某些情况下(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位数。
答案 0 :(得分:1)
这些数字完全取决于操作系统分配给Python的内存区域,不应被视为不透明的其他内容。
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,纯粹是因为后者可以处理更多内存。
你会发现,如果你更频繁地运行你的测试(穿插其他程序启动或退出,以及你的操作系统上的内存负载不同),数字会有很大差异。