学习Python,is和==的本质区别你知道吗?
admin
2023-07-09 08:44:22
0

在Python中,is和==都是用来对两个对象进行比较判断的,但两者却有本质的区别。

一:is操作符
is操作符是Python语言的一个内置操作符,它的作用是比较两个变量是否指向同一块内存区域,也就是判断id(对象)是否相等。
当两个变量是共享引用关系的话,它们指向的肯定是同一块内存区域,用is判断得到的结果肯定为True。

>>> a = 10
>>> b = a
>>> a is b
True

如果是下面的这种情况呢?

>>> a,b = 10,10
>>> a is b
True
>>> id(a), id(b)
(1794638576, 1794638576)
>>> a,b = "abc","abc"
>>> a is b
True
>>> id(a), id(b)
(2281621304632, 2281621304632)
>>> a = (1,2,3)
>>> b = (1,2,3)
>>> id(a), id(b)
(2281620654120, 2281620654264)
>>> a is b
False
>>> a[0] is b[0]
True
>>> id(a[0]), id(b[0])
(1794638288, 1794638288)

从以上例子可以看到,当对象是数值类型或者字符串时,当两个对象的值相等时,它们用is判断的结果就为True,这是因为它们的id是相等的,而元组类型却不是。在Python中,对于小整数和字符串类型,在创建一个数据对象时,会优先使用缓存中的数据,如果缓存中存在,就会使用同一个数据,对于大整数、浮点数、元组、列表、字典、集合这些数据类型,会重新创建一块内存用于存储数据对象,但它们的元素如果是小整数或字符串时,也会优先使用缓存数据,这也就能解释了上面的为什么a[0]和b[0]的id是一样的。
在Python3.5.2下测试,我们发现,-5-256这些小数字Python会使用缓存进行存储。
学习Python,is和==的本质区别你知道吗?

二、==操作符
==操作符用来判断两个对象的数据是否相等,而不用关注它们的id是否一致,例如:

>>> a = 10
>>> b = 10.0
>>> a == b
True
>>> id(a), id(b)
(1794638576, 2281597561472)

当两个类的实例进行比较时,如果实例的数据一致时也不一定相等,如下:

class TestEqual():
    def __init__(self, u, v): 
        self.u = u
        self.v = v

a = TestEqual(3, 4)
b = TestEqual(3, 4)
print(a == b)  # 输出结果为False

为了让类的实例可以进行==比较,需要重新实现eq函数。

class TestEqual():
    def __init__(self, u, v): 
        self.u = u
        self.v = v

    def __eq__(self, other):
        if self.u== other.u:
            return True
        else:
            return False

a = TestEqual(3, 4)
b = TestEqual(3, 5)
print(a == b)  # 输出结果为True

从上面这个示例可以看出,在eq函数内部定义的逻辑是只要u相等了,两个类的实例就可以判定为相等。

相关内容

热门资讯

美前副总统:共和党失去了方向,... 2026年是美国的中期选举年,共和党选情不利,可能在年底的选举中遭遇挫败。美国前副总统彭斯5月31日...
南枝原来去过中国?《给阿嬷的情... 《给阿嬷的情书》票房口碑双丰收,目前票房已突破13亿。凤凰卫视最新一期《问答神州》专访了该片导演蓝鸿...
法国海军扣押一艘俄“影子舰队”... 近日,法国海军在大西洋海域扣押了一艘据称从俄罗斯摩尔曼斯克出发的油轮,引发俄方强烈不满。俄新社6月1...
凤凰晚报丨面粉染头模仿黄仁勋,... 今日人物【面粉染头模仿黄仁勋,农村青年走红后称遭“法务”警告】“先赔偿5000元肖像侵权使用费,再删...
亲特朗普极右派候选人领跑哥伦比... 【文/观察者网 熊超然】当地时间5月31日,哥伦比亚总统选举拉开帷幕,首轮投票计票工作已完成逾99%...
2026年度网络举报系列宣传活... 5月28日至29日,以“每一件举报,都是共治的力量——豫你e行 同心护网”为主题的2026年度网络举...
中原首例帝企鹅DNA性别鉴定!... 近日,郑州海昌海洋公园正式对外公布中原首对人工繁育的帝企鹅萌宝的DNA性别鉴定报告。这是中原首个将 ...
我国科学家为细胞信号“导航”开... 新华社济南5月31日电(记者张力元)人体细胞犹如一座精密的通信城市,每天都有大量“指令”穿梭传递,调...
极端大风突袭哈尔滨!过山车停摆... 极目新闻记者 詹钘5月31日,受强对流天气影响,哈尔滨国际会展中心体育场相关设施受到损坏,原计划当晚...
三原电缆取得电缆接头连接用防护... 国家知识产权局信息显示,上海三原电缆附件有限公司取得一项名为“一种电缆接头连接用防护结构”的专利,授...