在Python的世界里,`is` 和 `==` 的区别是什么?
开场白
在Python的世界里,有些看似相似的符号,背后却藏着完全不同的逻辑——就像同样喊“苹果”,有人指的是手里握着的那个水果,有人却只认货架上贴的专属标签。is和==就是这样一对容易混淆的“孪生符号”,哪怕是刚入门的学习者,也常会在这两个符号上栽跟头,而搞懂它们的区别,恰恰是理解Python变量本质的关键一步。
概念介绍与例子
- 核心区别:
== 是值比较,只判断两个对象的“内容”是否相等;is 是身份比较,判断两个变量是否指向内存中的同一个对象(可理解为是否是“同一个实体”)。 - 例子1:
a = [1,2,3]b = [1,2,3]print(a == b) # 输出True(内容相同)print(a is b) # 输出False(内存中是两个不同的列表对象)
- 例子2:
c = 10d = 10print(c == d) # 输出Trueprint(c is d) # 输出True(小整数池机制,Python缓存了-5到256的整数,指向同一个对象)
- 例子3:
e = "hello"f = "hel" + "lo"print(e == f) # 输出Trueprint(e is f) # 输出True(字符串常量折叠机制,编译时已合并为同一个字符串对象)
引人入胜的相关问题
为什么明明两个变量的内容一模一样,用is判断却返回False?为什么有时候数字相同is返回True,换个大数字又返回False?如果想判断两个字典的内容是否一致,该用is还是==?
最终答案过程
- 先明确判断维度:
== 关注“内容相等”,会调用对象的__eq__()方法;is 关注“身份相同”,会比较两个对象的内存地址(可通过id()函数查看)。 - 结合例子验证:比如两个内容相同的列表,
id(a)和id(b)结果不同,所以is返回False;而小整数因缓存共享内存地址,is返回True。 - 总结使用场景:判断值是否相等用
==,判断是否为同一个对象(如单例、None)用is。
总结
== 比较对象的值,is 比较对象的内存地址(身份);- 小整数、短字符串等因Python缓存机制,可能出现值和身份都相同的情况;
- 实际开发中,判断值相等优先用
==,判断是否为同一个对象用is(如判断x is None)。