一文搞懂python中的is和==(深度解析)
python中的is用于比较对象的标识符是否相等。==是比较值是否相等。
对象的标识符可以简单地理解成对象的内存地址,在生命周期中是固定不变的。id()可以得到对象标识符的整数表示。示例如下
person1 = {"name": "zhangsan", "age": 20}
person2 = {"name": "zhangsan", "age": 20}
person3 = person1
# 输出各个字典对象的标识符,系统不同,得到的值可能不同
print(id(person1))
# 输出 52230888
print(id(person2))
# 输出 52231160
print(id(person3))
# 输出 52165352
# 可以看到,person1和person3的标识符是相同的,也就是说,它们是同一个对象
由上方示例可以看到,简单的=赋值,是将=两边的变量同时指向了一个内存地址,即指向同一个对象(person1和person3)。新建一个一模一样的对象,实际上是不同的对象(person1和person2),它们在内存中的地址是不同的。
下面我们分别用is和==比较它们
print(person1 == person2)
# 输出 True
print(person1 == person3)
# 输出 True
print(person1 is person2)
# 输出 False
print(person1 is person3)
# 输出 True
可以看到,用==判断时,person1、person2、person3比较的结果都是True,用is比较时,person1和person2比较的结果是False。
原因就是,is比较的是两个对象的内存地址,==比较的是两个对象的值。这一点可以在大多数情况下使用
对于继承自object的类产生的对象,==也是比较的内存地址。
class T1(object):
def __init__(self, name):
self.name = name
t1 = T1("zhangsan")
t2 = T1("zhangsan")
t3 = t1
print(t1 == t2)
# 输出 False
print(t1 is t2)
# 输出 False
print(t1 is t3)
# 输出 True
print(t1 == t3)
# 输出 True
#看上面的代码,截止到现在,除了t1和t2不相等之外,其他结果都和之前是一样的,我们再往下看
import copy
# 这里将t1深拷贝一份给t4,t1和t4的值是相同的,不过内存地址不同
t4 = copy.deepcopy(t1)
print(id(t1))
# 输出 51745848
print(id(t4))
# 输出 51746072
print(t1 == t4)
# 输出 False
print(t1 is t4)
# 输出False
上方可以验证,继承object的类 ,生成的实例,==判断的也是内存地址。
分析:
# ==其实是语法糖,t1 == t4 等同于 t1.__eq__(t4),
# 不同的对象内部实现了不同的 __eq__,那么我们同样适用==去比较时,实际上的逻辑判断是不同的。
# 正如 继承了object的类,实现的__eq__方法是判断内存地址是否相同。也有很多的对象是判断值是否相同
# 改写上方的T1类代码如下,再次执行上方代码,t1 == t4的结果就是True
class T1(object):
def __init__(self, name):
self.name = name
def __eq__(self, val):
return self.name == val.name
一些注意点:
日常写代码时,在变量和单例值之间比较时,应该使用is,因为is无法重载,python不需要寻找和调用特殊方法,而是直接比较内存地址。速度更快。常见使用场景如
# 判断a值为None
a is None
# 判断a值不为None
a is not None
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】