用Python比较对象==与is,你还在用==?out啦,来看这个!

news2024/11/25 2:19:56

目录

1、基础比较:== 和 is 📐

1.1 ==:值的比较

1.2 id()函数揭秘对象身份

1.3 is:身份的辨识

1.4 实战演练:列表、字典的比较陷阱

列表比较陷阱

2、深入理解比较操作符 🌀

2.1 不等号的妙用

2.2 成员资格in操作

3、自定义比较:__eq__等魔法方法 🎩

3.1 重载比较操作

3.2 rich comparison methods详述

3.3 实现不可变对象的比较

3.4 优化散列性能

4、高级技巧:functools.cmp_to_key 🧮

4.1 排序自定义对象

4.2 cmp_to_key函数实战

5、实战应用:排序与过滤 🧹

5.1 sorted()与list.sort()

5.2 filter()与lambda表达式

6、比较器与key函数:字典排序 🔀

6.1 dict排序新特性

6.2 itemgetter与attrgetter

7、性能考量:时间复杂度与优化 💨

7.1 比较操作的效率

7.2 选择合适的数据结构

8、总结 🎯



1、基础比较:== 和 is 📐

在Python中,对象间的比较是程序设计中的基础且重要的一环,它直接关系到数据处理的逻辑和效率。本章将深入探讨两种基本的比较操作符——==is ,通过实例解析它们的区别与应用场景。

1.1 ==:值的比较

==操作符用于判断两个对象的值是否相等,即比较的是对象的内容。当两个对象的内容一致时,==返回True,反之则返回False。这适用于各种基本类型如整数、字符串以及用户自定义类的对象,只要这些类实现了比较方法。

示例代码:

a = 5
b = 5
print(a == b)  # 输出: True

str1 = "hello"
str2 = "hello"
print(str1 == str2)  # 输出: True

class MyClass:
    def __init__(self, value):
        self.value = value

obj1 = MyClass(10)
obj2 = MyClass(10)
print(obj1 == obj2)  # 默认情况下会比较地址,因此输出: False

1.2 id()函数揭秘对象身份

id()函数返回对象的唯一标识符,即内存地址。结合“is” ,可以更直观理解对象的同一性。

示例:

a = 256
b = 256
print(id(a) == id(b))  # 输出可能为True ,因为小整数池的优化
c = 257
d = 257
print(id(c) == id(d))  # 输出通常为False,除非偶然,每个新建的整数对象地址不同

此例展示了Python对小整数的优化机制,以及id()在比较对象实体时的作用。

1.3 is:身份的辨识

不同于==对值的比较 ,is操作符用于检查两个变量是否引用同一个对象,即它们是否共享相同的内存地址。这意味着即使两个对象的内容相同,如果它们在内存中是独立创建的 ,is也会返回False

示例代码:

a = [1, 2, 3]
b = a  # b指向a的同一份内存地址
c = [1, 2, 3]

print(a is b)  # 输出: True,因为a和b指向同一对象
print(a is c)  # 输出: False,虽然内容相同,但a和c在内存中是不同的对象

在处理单例模式、常量或者比较None时 ,is的使用尤为关键,因为它能确保比较的是对象的唯一性而非仅是值的等价性。

1.4 实战演练:列表、字典的比较陷阱

在处理复杂数据结构时 ,==is的区别尤为重要。特别是对于可变对象如列表和字典,浅比较可能导致意外结果。

列表比较陷阱

考虑下面的例子:

g = [1, [2, 3]]
h = [1, [2, 3]]
print(g == h)  # 输出: True
print(g is h)  # 输出: False

尽管gh的外层列表相等,但它们仍然是两个独立的列表对象。然而,当列表内包含其他列表或字典时,情况变得微妙:

i = [{'key': 'value'}]
j = [{'key': 'value'}]
print(i == j)  # 输出: True
print(i is j)  # 输出: False

尽管看起来ij的结构和内容一致 ,is仍然指出它们不是同一个对象。这是因为字典也是可变对象,即使内容相同,每次创建都会在内存中生成新的实例。

通过上述对比,我们明确了==is在比较操作上的本质差异,这对于编写高效、逻辑严谨的Python代码至关重要。在实际应用中,合理选择比较方式能够有效避免潜在的逻辑错误和性能瓶颈。

2、深入理解比较操作符 🌀

深入探究Python中的比较操作符,不仅限于简单的等于与不等于,还包括了更多元化的比较逻辑 ,为编写高效、灵活的代码提供了强大支持。

2.1 不等号的妙用

不等号包括<><=>=,它们在Python中用于数值、字符串以及可比较对象的顺序比较。利用这些操作符,开发者能够轻松地对集合中的元素进行排序、筛选等操作。

代码示例:

ages = [25, 30, 20, 35]
sorted_ages = sorted(ages)  # 利用不等号逻辑进行排序
print(sorted_ages)  # 输出: [20, 25, 30, 35]

# 判断年龄是否在指定区间
age = 27
if 18 <= age < 60:
    print("符合工作年龄要求")  # 输出: 符合工作年龄要求

通过上述示例 ,可以看到不等号在处理条件判断和数据排序时的实用性。

2.2 成员资格in操作

in操作符用于检查一个值是否存在于序列(如列表、元组、字符串)或集合(如字典、集合)中 ,是判断成员资格的有力工具。此操作符不仅简化了代码逻辑 ,还提升了代码的可读性。

代码示例:

fruits = ['apple', 'banana', 'cherry']
if 'banana' in fruits:
    print("香蕉在列表中")  # 输出: 香蕉在列表中
    
# 集合示例
numbers_set = {1, 2, 3, 4, 5}
if 3 not in numbers_set:
    print("3不在集合中")
else:
    print("3存在于集合中")  # 输出: 3存在于集合中

通过in操作符,可以简洁明了地确认某个元素是否属于特定的数据结构,这对于条件分支逻辑尤其有用。掌握这些比较操作符,能够使你的Python代码更加灵活高效。

3、自定义比较:__eq__等魔法方法 🎩

在Python中,通过覆盖特定的特殊方法(也称为“魔法方法”),我们可以自

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1827824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝队-溯源技巧

溯源技巧 大致思想 通常情况下&#xff0c;接到溯源任务时&#xff0c;获得的信息如下 攻击时间 攻击 IP 预警平台 攻击类型 恶意文件 受攻击域名/IP其中攻击 IP、攻击类型、恶意文件、攻击详情是溯源入手的点。 通过攻击类型分析攻击详情的请求包&#xff0c;看有没有攻击者…

1586. 扫地机器人

问题描述 Mike同学在为扫地机器人设计一个在矩形区域中行走的算法,Mike是这样设计的:先把机器人放在出发点 (1,1)(1,1) 点上,机器人在每个点上都会沿用如下的规则来判断下一个该去的点是哪里。规则:优先向右,如果向右不能走(比如:右侧出了矩形或者右侧扫过了)则尝试向…

分布式数据库核心问题和解决方法

当下&#xff0c;由于成本压力以及数据保护的要求&#xff0c;采用国产数据库的呼声越来越高&#xff0c;但是国产数据库数量众多&#xff0c;良莠不齐&#xff0c;没有选择数据库比较靠谱的标准&#xff0c;业内真正懂得数据库的人很少&#xff0c;且为了这块大的蛋糕&#xf…

《C语言深度解剖》(19):从头开始全面理解C语言指针和数组

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

实例详解C/C++中static与extern关键字的使用

目录 1、概述 2、编译C++代码时遇到的变量及函数重复定义的问题 3、用 extern 声明外部变量 4、extern与全局函数 5、为何在变量和函数前添加一个static关键字编译就没问题了呢? 6、静态局部变量 7、函数的声明与定义都放置到一个头文件中,不使用static,通过宏控制去…

广东启动“粤企质量提升工作会议” 着力提升产品和服务质量

6月5日,由广东质量峰会组委会牵头,联合相关质量、信用、打假和检验检测等部门共同举办的“粤企质量提升工作会议”在广州正式启动。本次工作会议旨在贯彻落实《质量强国建设纲要》及《广东省质量强省建设纲要》精神,深入开展全民质量行动,弘扬企业家和工匠精神,营造政府重视质量…

实战17:GCN+LSTM图卷积神经网络预警预测 完整代码数据集

直接看视频演示: GCN+LSTM图卷积神经网络预警预测时间序列预测_哔哩哔哩_bilibili 模型图原理: 完整代码: import torch import torch.nn as nn import torch.optim as optim from torch_geometric.nn import GCNConv from torch.utils.data import DataLoader, TensorDat…

十二星座女、具有哪些情感特质。

白羊座&#xff08;奋不顾身&#xff09;。金牛座&#xff08;爱财如命&#xff09;。双子座&#xff08;灵活多变&#xff09;。 巨蟹座&#xff08;似水柔情&#xff09;。狮子座&#xff08;光明磊落&#xff09;。处女座&#xff08;尽善尽美&#xff09;。 天秤座&#xf…

【Unity学习笔记】第十八 基于物理引擎的日月地系统简单实现

转载请注明出处: https://blog.csdn.net/weixin_44013533/article/details/139701843 作者&#xff1a;CSDN|Ringleader| 目录 目标数学理论资源准备数据准备代码实现Unity准备效果展示注意事项后记 目标 目标&#xff1a;利用Unity的物理引擎实现 “日地月三体系统” 。 效果…

CubeMX Keil Configure

// 使用外部高速晶振 外部高速晶振为8M&#xff08;根据开发板上的晶振频率设置&#xff09;&#xff0c;使用 PLLCLK&#xff0c;HSE 选项 USART1 使用 Asynchronous&#xff0c;PA9&#xff0c;PA10引脚&#xff08;USART1 引脚根据开发板上引脚设置&#xff09; 设置MDK AR…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] URL拼接(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 URL拼接(100分) 🌍 评测功能需要订阅专栏后私信联系清隆解…

Pixel Transformer:用像素代替补丁可以提升图像分类精度

在快速发展的人工智能领域&#xff0c;ViTs已成为各种计算机视觉任务的基础模型。ViTs通过将图像划分为小块并将这些小块作为标记来处理图像。6月刚发布一篇论文&#xff0c;引入了一种新颖的方法&#xff0c;即像素级Transformers&#xff0c;它通过将单个像素视为令牌来挑战这…

大数据实训项目(小麦种子)-03、大数据环境Hadoop、Mapreduce、Hive、Hbase、HDFS搭建服务及调试

文章目录 前言一、Linux系统Centos7安装配置JDK8二、Linxu系统Centos7中搭建Hadoop3.1.0服务下载地址服务1&#xff1a;详细步骤&#xff08;初始化与启动dfs服务&#xff09;详细步骤配置环境变量 服务2&#xff1a;Hadoop(YARN)环境搭建 三、Linux系统搭建Hive3.1.2服务前提条…

桂电人工智能学院大数据实验,使用 Docker 搭建 hadoop 集群

桂电人工智能学院大数据实验&#xff0c;使用 Docker 搭建 hadoop 集群 第一步 安装 Docker, Windows 上可以使用 Docker Desktop 下载地址&#xff1a;https://www.docker.com/products/docker-desktop/ 安装过程自行谷歌 安装好的标志&#xff1a;打开终端 运行docker p…

产品人生(13):从“产品的RFM分析”看如何探索“职业方向”

我们在做产品分析时&#xff0c;经常会用到一种方法“产品的RFM分析”&#xff0c;它是一种客户细分和价值评估的常用方法&#xff0c;广泛应用于电子商务、零售和其他众多行业&#xff0c;它可以帮助企业和产品团队更好地理解用户行为&#xff0c;优化营销策略&#xff0c;提升…

基于协同过滤算法的电影推荐

基于协同过滤算法的电影推荐 电影推荐系统使用了基于**协同过滤&#xff08;Collaborative Filtering&#xff09;的算法来生成推荐。具体来说&#xff0c;使用了基于用户的协同过滤&#xff08;User-Based Collaborative Filtering&#xff09;**算法&#xff0c;步骤如下&am…

国外视频搬运素材去哪里找?可搬运下载国外的素材网站库分享

如果你正在寻找高质量的国外视频素材来提升你的视频制作水平&#xff0c;不用担心&#xff0c;今天我将为大家推荐几个知名的视频素材网站&#xff0c;让你轻松找到理想的素材资源。 蛙学府 首先推荐的是国内非常受欢迎的“蛙学府”。蛙学府是一个综合性网站&#xff0c;专门提…

通过Navicat Premium进行sql文件互转db文件

目录 一、获取原来数据sql文件 二、通过sql文件转换db文件 三、db文件转换成功 一、获取原来数据sql文件 原数据main右键》转储SQL文件》结构和数据》main.sql 二、通过sql文件转换db文件 新建db文件》Navicta》新建SQLite(SQ)》导入db文件》 main右键》运行SQL文件》 mai…

【调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新】

调试笔记-系列文章目录 调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 文章目录 调试笔记-系列文章目录调试笔记-20240611-Linux-配置 OpenWrt-23.05 支持泛域名 acme 更新 前言一、调试环境操作系统&#xff1a;Windows 10 专业版调试环境调试目标 二、调…

计算机专业:黄金时代是否依旧?

计算机专业&#xff1a;黄金时代是否依旧&#xff1f; 随着2024年高考落幕&#xff0c;数百万高三学生将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键节点&#xff0c;计算机相关专业是否仍是“万金油”的选择&#xff1f;在过去的几十年里&#xff0c;计算机科…