一文搞懂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
posted @   长沟流月去无声  阅读(821)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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】
点击右上角即可分享
微信分享提示