目录
在 Python 中,== 与 is 是一对极易混淆的运算符。 很多人会在它们的用法上犯错误。本文将带你从底层原理到实际应用,彻底搞懂 ==和 is 的区别。
一、核心结论
== 比较的是值是否相等,is 比较的是对象是否是同一个。
换句话说:
a == b:a 和 b 的值相等吗?
a is b:a 和 b 是同一个对象吗?
二、从例子中看区别
python
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True,因为值相同
print(a is b) # False,因为不是同一个对象
print(a is c) # True,c 和 a 指向同一个对象
a和b是两块不同的内存,但存储的列表内容相同。c直接指向 a的内存地址。
三、深入理解对象与值
Python 中一切皆对象,每个对象包含三个核心要素:
id:对象在内存中的唯一标识
type:类型
value:值
is比较的是 id是否相同(可通过 id() 查看),==比较的是 value是否相同。
python
x = [1, 2]
y = [1, 2]
print(id(x)) # 例如:140234567890
print(id(y)) # 例如:140234567990,不同
print(x is y) # False
四、为什么有时is会意外地返回 True?
Python 会对某些不可变对象做 缓存,导致看似不同的变量指向同一个对象,这时 is 也可能返回 True。
1. 小整数缓存
Python 启动时会预先创建 -5到 256 之间的整数对象并复用。
python
a = 100
b = 100
print(a is b) # True(因为小整数被缓存)
c = 257
d = 257
print(c is d) # False(超出缓存范围)
2. 字符串驻留
部分字符串(如仅包含字母、数字、下划线且长度较短)会被复用。
python
s1 = "hello"
s2 = "hello"
print(s1 is s2) # True(被驻留)
s3 = "hello world"
s4 = "hello world"
print(s3 is s4) # 可能是 False,取决于实现
注意:依赖缓存行为是不可靠的,不要用 is 做值的判断。
五、常见踩坑场景
坑 1:与 None 比较
这是最经典、最正确的使用场景:判断是否为 None 必须用 is。
python
x = None
if x is None: # 推荐
pass
if x == None: # 可以,但不规范
pass
PEP 8 明确建议:与 None 比较应当用 is 或 is not。
坑 2:与 True / False 比较
同样建议用 is,但实际多数场景直接用布尔判断更简洁。
python
flag = True
if flag is True: # 可以
pass
if flag: # 更 Pythonic
pass
坑 3:可变对象误用 is
python
def add_item(lst):
if lst is []: # 错误,永远不成立
lst = []
lst.append(1)
return lst
这里应使用 if not lst: 或 if lst == []。
六、如何检查两个对象是否为同一个?
使用 id() 或 is:
python
a = [1, 2]
b = a
print(id(a) == id(b)) # True
print(a is b) # True
七、性能层面
is 比 == 更快,因为它只比较内存地址,不需要调用任何 __eq__ 方法。
python
import timeit
print(timeit.timeit('a is b', setup='a=b=[1,2,3]'))
print(timeit.timeit('a == b', setup='a=b=[1,2,3]'))
但在实际开发中,正确性远比微小的性能差异重要。
八、总结
比较值与内容: ==
判断是否为 None: is、is not
判断是否为 True或False:is或直接使用布尔上下文
判断两个变量是否指向同一对象:is
判断容器内容是否相同:==
一句话总结:想比值用 == ,想比 身份(是否同一个对象)用 is
九、思考以下题目
下面代码的输出是什么?为什么?
python
a = 256
b = 256
print(a is b)
c = 257
d = 257
print(c is d)
e = "hello_python"
f = "hello_python"
print(e is f)
欢迎在评论区留下你的答案。
如果觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!

2万+

被折叠的 条评论
为什么被折叠?



