为什么' 20000是20000'结果是真的?

时间:2016-05-10 16:52:57

标签: python python-2.7 int literals python-internals

Python中的

is测试2个引用是否指向同一个对象。 -5和256之间的数字在内部缓存,所以:

a = 10
b = 10
a is b # Results in True

这是如何解释的:

20000 is 20000 # Results in True

这两个数字均高于256。 2个整数不应该是2个不同的对象吗?

2 个答案:

答案 0 :(得分:11)

Python解释器看到你正在重用一个不可变对象,所以它不打算创建两个:

>>> import dis
>>> dis.dis(compile('20000 is 20000', '', 'exec'))
  1           0 LOAD_CONST               0 (20000)
              3 LOAD_CONST               0 (20000)
              6 COMPARE_OP               8 (is)
              9 POP_TOP
             10 LOAD_CONST               1 (None)
             13 RETURN_VALUE

注意两个LOAD_CONST操作码,它们都在索引0处加载常量:

>>> compile('20000 is 20000', '', 'exec').co_consts
(20000, None)

在交互式解释器中,Python仅限于编译您单独输入的每个(简单或复合)语句,因此它不能在不同语句中重用这些常量。

但是在函数对象中,它肯定只会创建一个这样的整数对象,即使您多次使用相同的int文字也是如此。这同样适用于在模块级别运行的任何代码(因此在函数或类定义之外);这些都以相同的代码对象常量结束。

答案 1 :(得分:0)

Python将对象存储在内存中以提高效率。它只需要为20000分配一个内存块,因此两个引用都指向同一个内存块,从而产生True

相关问题