| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 系统运维 -> 【自动化运维番外篇】数据结构-1 -> 正文阅读 |
|
[系统运维]【自动化运维番外篇】数据结构-1 |
摘要
我们在【自动化运维新手村】初见Python一文中涉及到了Python中的列表和字典,我们提到列表是有序的,而字典不是有序的,大家可能对这个概念会有疑问? 列表有序性并不是指存储的元素是按顺序排列的,而是指元素存储的顺序会保持不变,任何时候遍历都会是创建时的顺序;但字典却不是,在Python3.6之前,字典在每次遍历的时候顺序都可能是不同的(仅限于3.6版本之前,之后的版本字典就变为有序字典,所以再看到有的文章盲目说Python是无序的,那要么是这个文章太老了,要不就…) 今天我们就带着大家从计算机的底层结构来深入理解一下Python中的列表和字典。 数组(Array)Python中的列表对应的数据结构就是数组,数组是一种十分常见的数据结构,属于线性表的一种。在计算机中的存储的样子大概是如下: 数组可以实现的操作有下面几种:
那我们就根据数组的存储原理来依次讲解: 1. 存储任何一种数据结构在计算机中存储的时候都需要考虑所占用空间大小的问题,那么数组究竟占用多少空间呢? 在数据结构中,数组中只能存储相同类型的元素,所以整个数组的空间大小其实取决于数组中元素的类型和元素的数量,不同数据类型占用的空间如下图: 所以,假设我们定义了一个10个长度的int类型的数组变量 2. 索引数组一个很大的好处就是可以按下标进行索引,假设我们有一个数组 划重点:数组下标从0开始 有个有意思的梗:想要看一个人是不是程序员,只要让他数十个数就可以,如果他从0开始数,那就铁定是程序员了。 很多人可能也会有疑问,为什么下标会从0开始,其实这也和数据的底层存储有关。 我们这里定义一个具有10个int元素的数组变量 由此可知,当我们要找
所以数组中我们常说的下标其实也叫做偏移量,想要按下标寻址某个元素,就是知道它的偏移量,那么理所当然数组中第一个元素肯定偏移量是0。 3. 插入删除数组的插入和删除又分为在末尾进行插入和删除,以及在中间进行插入和删除 3.1 数组尾部插入和删除我们根据上面的介绍已经知道了数组在内存中是一块连续的空间,所以当在数组的尾部进行插入和删除时,不需要任何额外的操作,时间复杂度为O(1)。 3.2 数组中间插入和删除当我们在数组的中间进行插入时,我们需要将插入位置之后的元素都向后挪动一位,然后将要插入的元素放在指定下标处; 而在数组中间进行删除时,为了保证数组内存空间的连续性,就需要将该下标位置之后的元素依次向前挪动一位; 当在数组的0位置处进行插入和删除时,性能耗费最大,时间复杂度为O(n) 4. 修改数组的修改的话其实就是先根据下标索引到该元素所在的内存地址,然后再对其进行修改,我们这里不做赘述。 5. 遍历由于数组内存空间的连续性,我们创建数组时元素的排列,无论何时遍历都可以保证是相同的,所以我们称数组具有有序性。 列表(List)由于Python中的列表对应的数据结构就是数组,所以我们搞清楚了数组的原理,对于列表的理解就会容易很多。 Python的列表具有和数组相同的操作方法,即遍历,索引,插入,删除,但也有不同之处 1. 元素我们默认数据结构中的数组所存储的元素都是相同类型的,事实上很多语言,例如C,Golang,Java等都要求在定义数组时声明其类型,比如Golang的数组创建的语法就为
所以Python中的列表虽然仍保留了数组的空间连续性,但它所占用的空间大小,却是和数组中存储的元素类型密切相关。 2. 长度我们默认数据结构中的数组在定义时需要初始化其长度,也就是其存储的元素数量,这样方便程序为其分配固定大小的内存空间,如C语言中数组的定义为 但Python在定义数组时并不要求定义其长度,语法为
Python中的List本质上是一个长度可变的连续数组。其中存在一个指针列表 需要注意的是, 因此 如果当前列表分配的空间已满(即 这篇文章我们着重理解了数组的底层原理以及Python中的List,这对于后续我们的编程会起到很大的帮助,如果把用Python编程是在计算机上蒙了一块黑布的话,那么对于计算机底层原理的学习,就会让我们一点点揭开这块黑布,最终直到我们写下每一行代码都能够清晰的了解到其真正的底层运行逻辑。 欢迎大家添加我的个人公众号【Python玩转自动化运维】加入读者交流群,获取更多干货内容 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/16 4:45:59- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |