为什么exec()在python上为-5分配不同的id?

时间:2013-02-05 14:44:00

标签: python exec

这是python代码。

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

我预计print语句只会显示Trues。 但事实并非如此。在-5下,显示为假。

结果是

-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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

  

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