Python中的字典与集合的底层实现原理

简介: Python中的字典与集合的底层实现原理

Python中字典与集合的实现原理

首先通过__new__方法创建对象,__init__方法进行属性绑定后,将对象添加到一个集合中,会自动调用__hash__方法的到哈希值,哈希值相等是会调用__eq__方法,会返回一个结果,如果返回结果为False怎添加成功。

class CanHash(object):
    def __new__(cls, *args, **kwargs):
        obj=object.__new__(cls)
        print(f"__new__方法创建了一个新对象id:{id(obj)}")
        return obj
    def __init__(self,value):
        print(f"__init__方法为对象绑定了attrs,id::{id(self)}")
        self.value=value
    def __hash__(self):
        print("__hash__方法被调用了")
        hash_value=hash(self.value)
        print(f'hash_value:{hash_value}')
        return hash_value
    def __eq__(self, other):
        print("__eq__方法被调用了")
        if isinstance(other,self.__class__):
            res= self.value == other.value
            print(f"hash桶内是同一个对象吗?{res}")
            return res
        else:
            print("不是同类对象,add失败")
            return False
c1=CanHash('a')
c2=CanHash('b')
c3=CanHash('c')
c4=CanHash('b')
s=set()
s.add(c1)
s.add(c2)
s.add(c3)
s.add(c4)
print(f"添加结果:{s}")
__new__方法创建了一个新对象id:139999721527712
__init__方法为对象绑定了attrs,id::139999721527712
__new__方法创建了一个新对象id:139999721209376
__init__方法为对象绑定了attrs,id::139999721209376
__new__方法创建了一个新对象id:139999721208416
__init__方法为对象绑定了attrs,id::139999721208416
__new__方法创建了一个新对象id:139999720858960
__init__方法为对象绑定了attrs,id::139999720858960
__hash__方法被调用了
hash_value:6082891539820400838
__hash__方法被调用了
hash_value:-575605371910081896
__hash__方法被调用了
hash_value:7415995645675622067
__hash__方法被调用了
hash_value:-575605371910081896
__eq__方法被调用了
hash桶内是同一个对象吗?True
添加结果:{<__main__.CanHash object at 0x7f5439a6be20>, <__main__.CanHash object at 0x7f5439a6ba60>, <__main__.CanHash object at 0x7f5439ab99a0>}
相关文章
|
3月前
|
机器学习/深度学习 Python
堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能
本文深入探讨了堆叠集成策略的原理、实现方法及Python应用。堆叠通过多层模型组合,先用不同基础模型生成预测,再用元学习器整合这些预测,提升模型性能。文章详细介绍了堆叠的实现步骤,包括数据准备、基础模型训练、新训练集构建及元学习器训练,并讨论了其优缺点。
148 3
|
3月前
|
机器学习/深度学习 算法 数据挖掘
线性回归模型的原理、实现及应用,特别是在 Python 中的实践
本文深入探讨了线性回归模型的原理、实现及应用,特别是在 Python 中的实践。线性回归假设因变量与自变量间存在线性关系,通过建立线性方程预测未知数据。文章介绍了模型的基本原理、实现步骤、Python 常用库(如 Scikit-learn 和 Statsmodels)、参数解释、优缺点及扩展应用,强调了其在数据分析中的重要性和局限性。
122 3
|
4月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
137 1
思科设备巡检命令Python脚本大集合
|
17天前
|
存储 缓存 Java
Python高性能编程:五种核心优化技术的原理与Python代码
Python在高性能应用场景中常因执行速度不及C、C++等编译型语言而受质疑,但通过合理利用标准库的优化特性,如`__slots__`机制、列表推导式、`@lru_cache`装饰器和生成器等,可以显著提升代码效率。本文详细介绍了这些实用的性能优化技术,帮助开发者在不牺牲代码质量的前提下提高程序性能。实验数据表明,这些优化方法能在内存使用和计算效率方面带来显著改进,适用于大规模数据处理、递归计算等场景。
54 5
Python高性能编程:五种核心优化技术的原理与Python代码
|
2月前
|
算法 数据处理 Python
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
Savitzky-Golay滤波器是一种基于局部多项式回归的数字滤波器,广泛应用于信号处理领域。它通过线性最小二乘法拟合低阶多项式到滑动窗口中的数据点,在降噪的同时保持信号的关键特征,如峰值和谷值。本文介绍了该滤波器的原理、实现及应用,展示了其在Python中的具体实现,并分析了不同参数对滤波效果的影响。适合需要保持信号特征的应用场景。
142 11
高精度保形滤波器Savitzky-Golay的数学原理、Python实现与工程应用
|
1月前
|
安全 数据挖掘 编译器
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
【01】优雅草央央逆向技术篇之逆向接口协议篇-如何用python逆向接口协议?python逆向接口协议的原理和步骤-优雅草央千澈
47 6
|
1月前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
40 2
|
2月前
|
缓存 数据安全/隐私保护 Python
python装饰器底层原理
Python装饰器是一个强大的工具,可以在不修改原始函数代码的情况下,动态地增加功能。理解装饰器的底层原理,包括函数是对象、闭包和高阶函数,可以帮助我们更好地使用和编写装饰器。无论是用于日志记录、权限验证还是缓存,装饰器都可以显著提高代码的可维护性和复用性。
45 5
|
2月前
|
缓存 开发者 Python
深入探索Python中的装饰器:原理、应用与最佳实践####
本文作为技术性深度解析文章,旨在揭开Python装饰器背后的神秘面纱,通过剖析其工作原理、多样化的应用场景及实践中的最佳策略,为中高级Python开发者提供一份详尽的指南。不同于常规摘要的概括性介绍,本文摘要将直接以一段精炼的代码示例开篇,随后简要阐述文章的核心价值与读者预期收获,引领读者快速进入装饰器的世界。 ```python # 示例:一个简单的日志记录装饰器 def log_decorator(func): def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args: {a
56 2
|
3月前
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
30 1