Python 2.* x86在Windows x64上id()函数能返回的最大值是多少?

0 投票
5 回答
1018 浏览
提问于 2025-04-17 10:08

Python 2.6中的x86版本的 id() 函数能返回的最大数字是多少呢?

我猜这个最大值应该是32位应用程序能看到的内存总量,也就是2的32次方,也就是4294967296吧?

(这对我来说没问题,因为我需要把这个值放到C#的类型里,UInt32或者符合CLS的Int64都可以,这也是我关心的原因,不过和问题本身无关。)

但是如果我在Windows x64上运行,内存超过2GB,比如说有32GB的内存,那么即使Python解释器本身是x86的,id()函数有可能返回超过2的32次方的值吗???

我在猜这可能和Python解释器对机器的理解有关——我想WoW64会把64位的内存地址转换成32位的地址——不过我只是猜测,我需要确认一下!

5 个回答

2
def func(n):
    max=0L
    for i in range(n):
        x=id(i)
        if x > max : max=x
    return max

for i in range(32):
    x=0L
    try:
        x=func(2**i)
        print '{0: 10}{1: 15}{2: 15}'.format(i,2**i,x)
    except:
        print '{0: 10}{1: 15}{2:>15}'.format(i,2**i,'error')

我觉得在实际情况中,id()函数能达到的最大值是2的32次方,但实际上它从来不会达到这么高的数字。我在32位的系统上试过上面的代码。如果我理解你的问题有误,请告诉我。

4294967296L是2的32次方,而我实际得到的最大id()值是1460876200。

18

来自相关文档的内容:

返回一个整数(或长整数)

在Python 2.x的amd64系统上,长整数是指比64位更大的整数。总之,在Python中,整数的大小没有限制。因此,id可以返回任意长的值

如果你想知道一个确切的最大值,可以假设你电脑上的可用内存是你得到的整数的上限。因此,对于32位系统,我会指定2232,而对于64位系统,则是2264。在x86架构的Python实现中,可以合理地认为上限是2232

cpython(最流行的Python实现)确实会返回一个内存地址(在Python/bltinmodule.c中的builtin_id):

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

这个值会是32位或64位的,但具体的表现是一个实现细节,正如文档中明确说明的那样。根据定义,程序员不应该依赖这些实现细节。

我非常怀疑使用ID有任何合理的用途,更不用说把它们传递给其他程序了。相反,你应该使用自定义对象表,或者直接传递一个集合。如果你打算将Python与C#一起使用,ironpython允许你在同一段代码中做到这一点。

1

假设关于 id() 的文档是正确的,并且 CPython(x86)返回的是对象的地址,那么它能返回的最大值是 232-1(也就是 4294967295)。我们可以通过一个简单的 C 程序来证明这一点:

#include <stdio.h>

int main(void) {
    void* p = 0;          // specify a pointer at 0
    p = ~p;               // invert all bits
    uintptr_t x = p;      // convert to an integer type fo the same size
    printf("%lu\n", x);
    return 0;
}

这个说法在不同的操作系统上都是成立的,使用 32 位指针类型编译的应用程序只能指定从 0 到 232-1 之间的地址。需要注意的是,应用程序中看到的地址可能并不对应某个具体的物理内存地址,这是因为使用了 虚拟内存

撰写回答