为什么“20000 是 20000”的结果是 True?
Why does '20000 is 20000' result in True?
is
in Python 测试 2 个引用是否指向同一个对象。
-5 到 256 之间的数字在内部缓存,因此:
a = 10
b = 10
a is b # Results in True
这如何解释像这样的事情:
20000 is 20000 # Results in True
两个数字都在256以上。
2 个整数不应该是 2 个不同的对象吗?
Python 将对象存储在内存中以提高效率。它只需要为 20000
分配一块内存,因此两个引用都指向同一块内存,导致 True
.
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 文字也是如此。这同样适用于 模块级别 的任何代码 运行(因此在函数或 class 定义之外);这些也都以相同的代码对象常量结束。
is
in Python 测试 2 个引用是否指向同一个对象。
-5 到 256 之间的数字在内部缓存,因此:
a = 10
b = 10
a is b # Results in True
这如何解释像这样的事情:
20000 is 20000 # Results in True
两个数字都在256以上。 2 个整数不应该是 2 个不同的对象吗?
Python 将对象存储在内存中以提高效率。它只需要为 20000
分配一块内存,因此两个引用都指向同一块内存,导致 True
.
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 文字也是如此。这同样适用于 模块级别 的任何代码 运行(因此在函数或 class 定义之外);这些也都以相同的代码对象常量结束。