【深入理解】元组tuple的底层实现(与C++进行对比)

        Python虽然没有指针类型,但是处处离不开指针,我们要认识到一点,只要操作系统是用C语言写的,就一定会使用到指针,因为使用某种语言,我们一定会定义变量,就必须申请进程的地址空间,也就注定会用到指针。
        所以Python虽然没有指针类型,但是在底层是会大量使用到指针的!下面我们主要来分析元组在底层是如何来实现的,其他关于元组的内容都和list大差不差。

一、元组的底层原理(简单理解)

        在学习元组的时候,我们知道元组具有以下的特性

  1. 定长的
  2. 元组的元素是不可改变的
  3. 元组的元素可以是各种类型
  4. 若元组中包含可变对象,则可变对象的元素是可以改变的

思考:我们已经知道元组中的元素是不可以被改变的,但是为什么元组中包含一个可改变对象,
如(列表),我们就可以去改变它呢?

        其实要理解这个现象,就要从元组的底层原理来展开了,我们可以先简单理解元组直接存的并不是元素对象本身,而是对元素对象的索引,也就是指向每个元素对象的指针!这也解释了为什么Python虽然没有指针类型,却处处离不开指针的原因。

        我们现在理解了元组本质上存的是每个元素的指针,那如何来实现元素不变呢?

        在C/C++语言中要想实现类似元组的数据结构,就要先考虑元组元素不可变,但前提就必须是元组的每个指针的指向不能变,必须是一个const pointer,只有恒定的指向每个元素才能继续保证指向的元素不变,所以我们会采用指针数组来实现,同时还要保证元组可以存储任意数据类型

C语言模拟元组的结构:

const void* const tuple[];
  • tuple是一个指针数组,每个元素的类型都是 const void* const 类型
  • 第一个const保证其指向的对象不可变性
  • 第二个const保证指针自身的不可变性
  • void*保证可以接收各种数据类型的对象的地址,届时只需做强转来增大访问权限即可      

【注】事实上,元组的实现比这个复杂的多,我们只是简单理解!

思考:我们理解了元组的不可变性和支持各种类型,那元组是如何保证定长的呢?

        其实这个很容易了,在C/C++中,我们可以直接不提供修改、删除、增加的接口就行

思考:为什么元组元素为可变对象(如列表),可变对象的内部元素是可以改变的?

        在C语言中就类似这样的场景:

int a = 3;
double d = 3.14;
int arr[] = {1,2,3};
const void* const tuple[] = {&a, &d, arr};

        其实这里并不能很好的诠释可变对象的内部元素可以改变,因为上面的代码是都不可改变的

        我们可以这样理解:当我们使用Python的元组中存放了一个可变对象时,在底层就会强转为可以改变的权限也就是void* const ,理解成底层自动识别上层用户存放的是否是可变对象即可,不是看可变对象就强转为const type* const ,反之 type* const。

思考:为什么元组采用存放元素对象的指针的方式?

        首先元组的元素是不可变的,一旦创建,无法改变,所以当我们创建大量相同的数据时,存放指针的优势就展现出来了,可以减少内存空间的开辟,多次复用相同空间的值

二、元组简单的补充

当我们的元组中只有一个元素时,必须在元素后面➕逗号,而不是括号➕元素

(防止Python解释器认为其是一个冗余的括号)

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

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

相关文章

内容评分越高,谷歌排名就越靠前吗?

我研究并分析了目前流行的四个内容优化工具的内容评分和Google排名之间的关联性:Clearscope、 Surfer、 MarketMuse 和 Frase,结果显示关联性普遍不高。 虽然相关性并不一定意味着绝对的因果关系,但也表明,一味的追求内容得分并不…

AGI 之 【Hugging Face】 的【Transformer】的 [ 解码器 ] / [ 认识 Transformer ]的简单整理

AGI 之 【Hugging Face】 的【Transformer】的 [ 解码器 ] / [ 认识 Transformer ]的简单整理 目录 AGI 之 【Hugging Face】 的【Transformer】的 [ 解码器 ] / [ 认识 Transformer ]的简单整理 一、简单介绍 二、Transformer 三、解码器 四、认识Transformer 1、Transf…

某DingTalk企典 - Token

⚠️前言⚠️ 本文仅用于学术交流。 学习探讨逆向知识,欢迎私信共享学习心得。 如有侵权,联系博主删除。 请勿商用,否则后果自负。 网址 aHR0cHM6Ly9kaW5ndGFsay5jb20vcWlkaWFuLw 浅聊一下 没毛病,就这字段,有效期…

将QT移植到IMX6ULL开发板

文章目录 前言一、编译系统1.设置交叉编译工具链2.编译系统3.烧写 二、Linux中下载QT1.安装 Qtcreator2.创建第一个程序3.配置 QtCreator 开发环境(1)打开选项界面(2)选择编译器(3)设置编译器(4…

电脑回收站删除的文件怎么恢复?5个恢复方法详解汇总!

电脑回收站删除的文件怎么恢复?在我们日常使用电脑的过程中,难免会遇到误删文件的情况。一旦发现自己误删文件了,先不要着急,还是有很多方法可以找回的。市面上还是有很多好用的文件恢复软件可以使用,具体介绍如下。 本…

学习伦敦金技术分析的具体步骤是什么?

技术分析是我们分析伦敦金市场的重要工具,刚入市就面对时涨时跌的市场应该如何交易呢?投资者如果不掌握技术分析的方法,恐怕对这个问题会没有头绪。入场都没有,盈利就更加无从谈起了。而学习技术分析,是有不同的阶段、…

Linux之文本三剑客

Linux之三剑客 Linux的三个命令,主要是用来处理文本,grep,sed,awk,处理日志的时候使用的非常多 1 grep 对文本的内容进行查找 1) 基础用法 语法 grep 选项 内容|正则表达式 文件选项: -i 不区分大小写 -v 排除,反选 -n 显示行号 -c 统计个数查看文件里包含有的内容 [roo…

PE文件学习

一、介绍 PE文件,即Portable Executable文件,是一种标准的文件格式,主要用于微软的Windows操作系统上。这种格式被用来创建可执行程序(如.exe文件)、动态链接库(.DLL文件)、设备驱动&#xff0…

每日一练:攻防世界:Hidden-Message

追踪UDP数据流,没有任何隐藏信息: WP: 观察流量包 每个流的唯一的区别就是UDP的源地址srcport的最后一位在变化 都提取出来就是二进制序列 用tshark提取一下 //使用tshark过滤出源端口,使用cut裁取端口的最后一位 tshark -r 8…

金融(基金)行业信创国产化特点及统一身份认证解决方案

金融业在政策支持及自主驱动下,金融信创取得快速发展。从2020年开始,三期试点已扩容至5000余家,进入全面推广阶段。而基金行业信创建设与银行、证券、保险这些试点行业相比,进展较为缓慢。 基金行业信创当前面临的问题 与多家基…

开源的基于图像识别本地实名认证系统(本项目不借助任何api) v1.0

前言: 本项目主要是代替昂贵的实名认证服务api或者sdk,目前仍然存在很多缺点 一、具体介绍 1.组成: 人脸识别服务器分为两部分: (1)、http服务端 server.py共有四个函数: DrawFaceinIdCard:用户上传身份证图片后,服务端会对身份证进行抠人像和ocr处理…

基于改进高斯-拉普拉斯滤波器的一维时间序列平滑与降噪(MATLAB)

以图像处理为例,拉普拉斯算子是基于图像的二阶导数来找到边缘并搜索过零点,传统的拉普拉斯算子常产生双像素宽的边缘,对于较暗区域中的亮斑进行边缘检测时,拉普拉斯运算就会使其变得更亮。因此,与梯度算子一样&#xf…

Linux高并发服务器开发(十一)UDP通信和本地socket通信

文章目录 1 TCP和UDP的区别2 UDPAPI流程服务端流程客户端流程 代码服务端客户端 3 本地socket通信服务端客户端客户端代码 1 TCP和UDP的区别 2 UDP API 流程 服务端流程 客户端流程 代码 服务端 #include<sys/socket.h> #include<stdio.h> #include<arpa/in…

二叉树与堆相关的时间复杂度问题

目录 满二叉树与完全二叉树高度h和树中节点个数N的关系 向上调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向下调整算法&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a; 向上调整建堆&#xff1a; 介绍&#xff1a; 复杂度推导&#xff1a;…

利用Arcgis绘制克吕金插值图

工作中我们常用到克吕金插值图&#xff0c;下面简单介绍下使用Arcmap绘制克吕金插值图的方法及注意事项&#xff0c;希望能帮到大家。 一、准备工作 软件&#xff1a;Arcgis 数据&#xff1a;点图层、研究范围 二、操作步骤 1 添加数据 打开Arcmap&#xff0c;从添加位置将…

JAVA数字化产科管理平台源码:涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理

JAVA数字化产科管理平台源码&#xff1a;涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全流程的信息化管理 智慧产科管理系统是基于自主研发妇幼信息平台&#xff0c;为医院产科量身打造的信息管理系统&#xff0c;涵盖了孕妇从建档、产检、保健、随访、分娩到产后42天全…

企商在线出席2024全球数字经济大会城市副中心论坛

2024年7月3日&#xff0c;2024全球数字经济大会城市副中心论坛“数字基础设施绿色创新发展分论坛”在北京市通州区成功举办。企商在线产品及解决方案总监孙杰受邀出席本次会议&#xff0c;并参与圆桌对话环节&#xff0c;分享“绿色”发展思路与经验。 2024全球数字经济大会城市…

身边有填报志愿需求别错过!张雪峰透露今年志愿填报技巧:报专业,别报行业!(文末附稳定高薪专业推荐)

高考填报志愿是每个考生和家长都要面对的重大抉择。在当前就业形势日趋严峻、部分行业发展前景不明朗的大背景下,考生在填报志愿时更需要全面了解各个专业的就业前景,理性权衡自身兴趣特长与社会需求&#xff0c;而不是盲目跟风报考所谓的"热门专业"。 今天跟大家分…

期权开户零门槛怎么操作?期权不满50w的开户方式

今天带你了解期权开户零门槛怎么操作&#xff1f;期权不满50w的开户方式。在股票期权市场上&#xff0c;期权交易是一种非常受欢迎的投资方式。它不仅可以增加投资组合的多样性&#xff0c;还可以为投资者提供一定的保护和利润机会&#xff0c;比如通过买入认股期权做空对冲大盘…

如何选择视频号矩阵系统:打造高效短视频内容生态的指南

在短视频内容创作和分发的热潮中&#xff0c;视频号矩阵系统作为一种高效的管理工具&#xff0c;受到了越来越多创作者和品牌的青睐。它通过集中管理多个视频号&#xff0c;优化内容发布流程&#xff0c;帮助用户提升工作效率和内容影响力。本文将探讨如何选择一个合适的视频号…