← 返回首页
1.
2.
Python 语法中 “==” 和 “is” 的区别是什么?
在 Python 中,== 和 is 是两个完全不同维度的比较运算符。它们的核心区别在于:== 比较的是“值(Value)”,而 is 比较的是“身份(Identity)”。
1. ==:值相等(Value Equality)
- 作用:判断两个对象的内容/值是否相同。
- 底层原理:它实际上调用了对象内部的魔术方法
__eq__()。只要类实现了这个方法,就可以自定义==的比较逻辑。 - 示例:只要两个列表里的元素一模一样,它们就是相等的。
list1 = [1, 2, 3] list2 = [1, 2, 3]print(list1 == list2) # True (值相同)
2. is:身份相等(Identity Equality)
- 作用:判断两个变量是否指向内存中的同一个对象(即判断它们的内存地址是否相同)。
- 底层原理:它等价于
id(a) == id(b)。它不关心对象的内容,只关心它们是不是“同一个东西”。 - 示例:虽然上面两个列表的值一样,但它们是在内存中分别创建的两个独立对象,所以
is返回False。print(list1 is list2) # False (内存地址不同)list3 = list1
print(list1 is list3) # True (list3 只是 list1 的一个引用,指向同一块内存)
开发中的核心避坑指南:什么时候该用哪个?
-
比较普通值(数字、字符串、列表、字典等): 永远使用
==。不要使用is来比较值,因为 Python 内部有一些缓存机制(如小整数池、字符串驻留),可能会导致is碰巧返回True,从而引发难以察觉的 Bug。a = 256 b = 256 print(a is b) # True (因为 Python 缓存了 -5 到 256 的整数)c = 257
d = 257
print(c is d) # False (超出缓存范围,重新分配了内存)
-
判断是否为
None: 永远使用is。None在 Python 中是一个单例对象(全局唯一),使用is不仅语义更清晰,而且性能比==更好(不需要调用__eq__方法)。if my_var is None: print("变量为空")
一句话总结:== 问的是“你们俩长得一样吗?”,is 问的是“你们俩是同一个人吗?”。