Python 中的 is 和 == 有什么区别?
很多刚学 Python 的同学,经常会把 is 和 == 搞混,用起来没报错,但结果总是让人一脸懵。其实它们看着像双胞胎,干的活完全不一样。
is:看的是“是不是同一个人”
is 是比较两个变量是不是同一个对象,说白了就是看它们的内存地址是不是一样。就好比你和你身份证上的那个人是不是同一个人——长得一样没用,身份证号必须一致。
a = [1, 2, 3]
b = a
print(a is b) # True,b 就是 a 本人
c = [1, 2, 3]
print(a is c) # False,长相一样,但不是同一个对象
在 Python 里,有些值是会被缓存的,比如小整数(-5 到 256)和部分字符串。这时候就算你新建变量,它们也可能指向同一个内存地址,所以 is 会返回 True。
x = 256
y = 256
print(x is y) # True,小整数缓存
x = 257
y = 257
print(x is y) # False,超出缓存范围
这个特性别用来判断值相等,因为它带点“偶然性”,换个版本或者实现方式可能结果就变了。
==:看的是“长得像不像”
== 是比较两个对象的值是否相等,跟它们是不是同一个对象没关系。只要内容相同,就会返回 True。
a = [1, 2, 3]
c = [1, 2, 3]
print(a == c) # True,内容一样
print(a is c) # False,不是同一块内存
像列表、字符串、字典等类型,都重写了 __eq__ 方法,所以 == 会去比较它们的值。而一些没重写的类,== 默认跟 is 是一个效果。
最常见的坑,就是用 is 去判断两个内容相同的字符串。
s1 = "hello world"
s2 = "hello world"
print(s1 == s2) # True,值一样
print(s1 is s2) # 有可能 True,也可能 False,取决于内存优化
这就是为什么有时候你测试没问题,换个环境就翻车了。
还有个特例是和 None 比较。这种情况推荐用 is,因为 None 在 Python 里是全局唯一的单例,直接比较身份更快更准确。
data = None
if data isNone:
print("data 是 None")
小实验:is vs ==
我们可以直接跑一段代码,看它们的差别。
# 数字
a, b = 256, 256
print(a == b, a is b) # True True
a, b = 257, 257
print(a == b, a is b) # True False
# 列表
x = [1, 2]
y = [1, 2]
print(x == y, x is y) # True False
# None
n = None
print(n isNone) # True
print(n == None) # True,但推荐 is
总结
** is**:比较对象身份(内存地址),适合用在判断None、单例对象等。** ==**:比较对象值(内容),判断两个值是否相等时用它。千万别用 is来判断值相等,尤其是字符串和数字,否则迟早踩坑。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领