1

这是python代码。

for e in range(-10, 10):
    exec('x=%d'% e)
    exec('y=%d'% e)
    print e, id(x), id(y), x is y

我预计打印语句只显示 Trues。但事实并非如此。在 -5 下,显示 False。

结果是

-10 38832080 38832056 False
-9 38832032 38832080 False
-8 38832056 38832032 False
-7 38832080 38832056 False
-6 38832032 38832080 False
-5 30857416 30857416 True
-4 30857392 30857392 True
-3 30857368 30857368 True
-2 30857344 30857344 True
-1 30857320 30857320 True
0 30857296 30857296 True
1 30857272 30857272 True
2 30857248 30857248 True
3 30857224 30857224 True
4 30857200 30857200 True
5 30857176 30857176 True
6 30857152 30857152 True
7 30857128 30857128 True
8 30857104 30857104 True
9 30857080 30857080 True

为什么exec在-5下分别为x和y分配不同的id?

4

2 回答 2

1

这是一个 cpython 实现细节。您应该使用==来检查整数是否相同。令人惊讶的是,cpython 实际上返回True了一些整数:

x = -5
y = -5
print x is y  #suprisingly prints `True` with cpython

这是因为 cpython“实习生”小整数是为了提高效率——它可以做到这一点,因为整数是不可变的类型。它也对字符串做同样的事情。

于 2013-02-05T14:45:00.070 回答
1

CPython 缓存 -5 到 256 之间的小整数。参见PyInt_FromLong

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。

于 2013-02-05T14:47:23.653 回答