当前位置: 首页 > article >正文

5分钟搞懂 Python 中的 ‘==‘ 和 ‘is‘ ,看这篇就够了

大家好,今天我们来聊一聊Python中两个常常让人困惑的运算符:==is。虽然它们看起来相似,但实际上有着非常重要的区别。

“==”运算符

“==”运算符用于判断两个对象的值是否相等。它比较的是对象的内容,而不是它们在内存中的位置。

a = [1, 2, 3]   
b = [1, 2, 3]   
print(a == b)  
# 输出: True

在这个例子中,虽然a和b是不同的对象,但它们的内容是相同的,所以“==”运算符返回True。

“is”运算符

“is”运算符用于判断两个对象是否引用同一个内存地址。它比较的是对象的身份(identity),而不是它们的内容。

a = [1, 2, 3]   
b = [1, 2, 3]   
print(a is b)  
# 输出: False

对象的标识符可以简单地理解成对象的内存地址,在生命周期中是固定不变的。id()可以得到对象标识符的整数表示。示例如下:

a = [1, 2, 3]   
b = [1, 2, 3]   
print(id(a))   
print(id(b))

在这个例子中,a和b虽然内容相同,但它们是两个不同的对象,存储在不同的内存位置,所以“is”运算符返回False。

深入理解

值相等与身份相同

为了更好地理解这两个运算符,我们可以将它们类比为生活中的例子。想象两个相同内容的书,虽然它们的内容完全相同,但它们是两本不同的书(不同的物理位置)。这就类似于“==”和“is”的区别。

  • “==”:这两本书的内容是否相同?

  • “is”:这两本书是否是同一本书?

常见数据类型的行为

数字和字符串

对于小整数和字符串,Python会进行缓存(interning),所以在某些情况下,“is”可能会返回True。

a = 100   
b = 100   
print(a is b)  
# 输出: True      
a = 1000   
b = 1000   
print(a is b)  
# 输出: False      
a = "hello"   
b = "hello"   
print(a is b)  
# 输出: True

对于较小的整数(-5到256)和字符串,Python会复用对象,因此“is”运算符可能返回True。但对于较大的整数或某些复杂对象,Python不会复用内存地址,因此“is”运算符会返回False。

列表和字典

对于可变数据类型,如列表和字典,“is”运算符通常返回False,因为每次创建的都是不同的对象。

a = [1, 2, 3]   
b = [1, 2, 3]   
print(a is b)  
# 输出: False      
a = {"key": "value"}   
b = {"key": "value"}   
print(a is b)  
# 输出: False

实际案例分析

通过实际案例,我们可以更直观地理解“==”和“is”的区别。

案例一:比较列表
list1 = [1, 2, 3]   
list2 = list1   
list3 = list1[:]      
print(list1 == list2)  
# 输出: True   
print(list1 is list2)  
# 输出: True   
print(list1 == list3)  
# 输出: True   
print(list1 is list3)  
# 输出: False

解释:

  • • list1和list2引用同一个列表对象,所以“==”和“is”都返回True。

  • • list3是list1的一个副本(通过切片创建),所以“==”比较内容相同,返回True,但“is”比较内存地址不同,返回False。

案例二:比较字符串
str1 = "hello"   
str2 = "hello"   
str3 = "".join(["he", "llo"])      
print(str1 == str2)  
# 输出: True   
print(str1 is str2)  
# 输出: True   
print(str1 == str3)  
# 输出: True   
print(str1 is str3)  
# 输出: False

解释:

  • • str1和str2是相同的字符串常量,Python进行缓存,复用了同一个对象,所以“==”和“is”都返回True。

  • • str3是通过拼接创建的新字符串对象,虽然内容相同,但内存地址不同,所以“==”返回True,而“is”返回False。

最后,大概总结下:

1.在Python中,“==”和“is”是两个功能不同的运算符:

==(等于): 用于比较两个对象的值是否相等。

is(身份运算符): 用于比较两个对象的身份(即内存地址)是否相同。

**2.缓存机制的影响:**对于一些小整数和短字符串,Python 会进行缓存,因此在这些情况下,is 可能会返回 True

**3.可变对象和不可变对象:**对于可变对象(如列表、字典等),即使内容相同,它们也是不同的对象;而对于不可变对象(如整数、字符串等),可能会因为缓存机制而指向同一个对象。

希望通过这篇文章,你能更清楚地理解 Python 中 ==is 的区别。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

点击领取,100%免费!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

在这里插入图片描述


http://www.kler.cn/news/363383.html

相关文章:

  • 管理类联考 信息整理和经验分享
  • DPDK如何提高网络性能
  • JVM、字节码文件介绍
  • 《Linux从小白到高手》综合应用篇:深入理解Linux常用关键内核参数及其调优
  • Linux中如何理解一切皆文件
  • 100种算法【Python版】第4篇——回溯法
  • Stack和Queue(3)
  • Single Engine + All Data :云器科技怎么基于“增量计算”的一体化湖仓平台,构建新一代流批一体数据平台,
  • 重构复杂简单变量之用类替换类型码
  • DevExpress WPF中文教程:Data Grid的视图概述及主要功能一览
  • Java之动态代理
  • MoeCTF 2024 ---Misc方向WP
  • 【WPF】中Dispatcher的DispatcherPriority参数使用
  • 滚雪球学Redis[8.2讲]:Redis的未来发展趋势:从云服务到AI与物联网的前沿探索
  • javaWeb项目-ssm+jsp大学生校园兼职系统功能介绍
  • 【网络安全渗透测试零基础入门】之Hydra密码爆破工具使用教程图文教程,超强干货建议收藏!
  • AI大模型应用(3)开源框架Vanna: 利用RAG方法做Text2SQL任务
  • 【表情识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+算法模型+TensorFlow
  • Windows.h 和pcl有冲突
  • 通用序列化和反序列化实现思路
  • 使用注解@ExcelIgnoreUnannotated实现了在导出 Excel 时忽略没有被标注的字段
  • 【已解决】【Hadoop】HDFS操作时:未找到命令的解决办法
  • 无线领夹麦克风哪个牌子好,麦克风品牌排行榜前十名,选购推荐
  • 人工智能:重塑未来生活与工作的科技力量
  • QT 实现随机码验证
  • Spring + WebSocket