Python中给两个变量赋值为500时'is'运算符为何返回True?
问题原因说明
你提到的is运算符判断规则是正确的:is确实只有在两个变量指向内存中同一个对象时才会返回True,你观察到的特殊结果是Python解释器的代码块常量复用优化机制导致的,和常见的小整数驻留机制无关。
具体原理
- 首先澄清小整数驻留机制的适用范围:Python默认会缓存-5~256范围内的所有整数对象,只要引用这个范围内的整数,所有变量都会指向同一个缓存对象,所以这个范围内的整数赋值给不同变量时
is都会返回True。但500不在这个缓存范围里,所以这个机制和你遇到的现象无关。 - 你测试的代码如果是写在同一个
.py脚本文件,或是交互环境中写在同一行代码里,Python解释器在编译当前代码块的时候,会扫描其中所有的不可变类型字面量(包括整数、字符串等),把值相同的字面量统一指向同一个对象,避免重复申请内存空间,所以你定义的两个500会被识别为同一个常量,指向同一个内存地址,最终a is b返回True。
验证方法
你可以在Python交互式解释器中分开两行输入代码测试,就会得到你预期的结果:
>>> a = 500 >>> b = 500 >>> a == b True >>> a is b False
这是因为交互环境中每一行都是独立的代码块,编译的时候不会跨代码块复用常量,所以两个500会被分配独立的内存空间。
注意事项
日常开发中不要依赖is判断数值、字符串等不可变类型的值是否相等,is的结果受解释器优化策略影响,不同版本、不同运行环境的表现可能不一致,判断值相等统一使用==运算符即可。
内容的提问来源于stack exchange,提问作者Mysasas
相关产品推荐
相关产品推荐

