Python列表中相等值是否共用同一引用?能否让a is b返回False
是否存在a is b返回False的场景?
当然存在,首先要先明确两个运算符的核心区别:
==只判断两个对象的值是否相等is判断两个对象是不是内存中的同一个对象,本质比较的是对象的内存地址
你给出的示例返回True,是因为Python自带字符串驻留(intern)优化:符合标识符规则的短字符串会被缓存复用,相同内容的短字符串字面量会指向同一个内存对象,所以a is b返回True。
常见a == b为True但a is b为False的场景
- 超出驻留规则的字符串
长字符串、包含特殊字符的字符串不会触发驻留,相同值也是不同对象:
>>> a = 'hello world!' * 100 >>> b = 'hello world!' * 100 >>> a == b True >>> a is b False
- 类型不同的等值对象
两个不同类型的对象值可能相等,但显然不是同一个对象:
>>> a = 2 >>> b = 2.0 >>> a == b True >>> a is b False
- 内容相同的可变对象
列表、字典这类可变对象,哪怕内容完全一致,单独创建时也是不同的内存对象:
>>> a = [1, 2, 3] >>> b = [1, 2, 3] >>> a == b True >>> a is b False
- 超出缓存范围的整数
Python默认只缓存-5到256之间的小整数,超出这个范围的等值整数也可能是不同对象(该效果在Python交互模式下可复现,部分IDE、脚本模式会做额外优化可能返回True):
>>> a = 257 >>> b = 257 >>> a == b True >>> a is b False
使用建议
日常开发中判断值相等优先用==,只有判断对象是否为None、或者需要明确判断是不是同一个内存对象时才用is。
内容的提问来源于stack exchange,提问作者mooder
相关产品推荐
相关产品推荐

