彻底搞懂Python中的“==”与“is”的区别,别再踩坑了!

目录

一、核心结论

二、从例子中看区别

三、深入理解对象与值

四、为什么有时is会意外地返回 True?

五、常见踩坑场景

六、如何检查两个对象是否为同一个?

七、性能层面

但在实际开发中,正确性远比微小的性能差异重要。

八、总结

九、思考以下题目

在 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)

欢迎在评论区留下你的答案。

如果觉得这篇文章对你有帮助,欢迎点赞、收藏、关注!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值