Python技术迷

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 全部免费领