用最复杂的方式学会数组(Python实现动态数组)

在本博客中,我们将学习探讨Python的各种“序列”类,内置的三大常用数据结构——列表类(list)、元组类(tuple)和字符串类(str)。

不知道你发现没有,这些类都有一个很明显的共性,都可以用来保存多个数据元素,最主要的功能是:每个类都支持下标(索引)访问该序列的元素,比如使用语法 Seq[i]。其实上面每个类都是使用 数组 这种简单的数据结构表示。

但是熟悉Python的读者可能知道这3种数据结构又有一些不同:比如元组和字符串是不能修改的,列表可以修改。

计算机内存中的数组结构

计算机体系结构中,我们知道计算机主存由位信息组成,这些位通常被归类成更大的单元,这些单元则取决于精准的系统架构。一个典型的单元就是一个字节,相当于8位。

计算机系统拥有庞大数量的存储字节,那么如何才能找到我们的信息存在哪个字节呢?答案就是大家平时熟知的 存储地址 。基于存储地址,主存中的任何字节都能被有效的访问。实际上,每个存储字节都和一个作为其地址的唯一二进制数字相关联。如下图中,每个字节均被指定了存储地址:

用最复杂的方式学会数组(Python实现动态数组)

一般来说,编程语言记录标识符和其关联值所存储的地址之间的关系。比如,当我们声明标识符 \(x\) 就有可能和存储器中的某一值相关联,而标识符 \(y\)就可能和其他的值相关联。一组相关的变量能够一个接一个地存储在计算机存储器的一块连续区域内。我们将这种方式称为 数组

我们来看Python中的例子,一个文本字符串 HELLO 是以一列有序字符的形式存储的,假定该字符串的每个Unicode字符需要两个字节的存储空间。最下面的数字就是该字符串的索引值。

用最复杂的方式学会数组(Python实现动态数组)

我们可以看到,数组可以存储多个值而无需构造具有特定索引的多个变量来指定其中的每个项目,并且几乎在所有编程语言(例如C、Java、C#、C++)中使用,但是Python更具有优势。Python在构建列表时,熟悉的读者可能知道,不需要预先定义数组或列表的大小,相反,在Python中,列表具有动态性质,我们可以不断的往列表中添加我们想要的数据元素。接下来,让我们看看Python列表的知识(已经熟悉的读者可以快速浏览或者跳过)。

Python列表 Python列表的操作

创建列表的语法格式:

[ele1, ele2, ele3, ele4, ...]

创建元组的语法格式:

(ele1, ele2, ele3, ele4, ...)

元组比列表的内存空间利用率更高,因为元组是固定不变的,所以没有必要创建拥有剩余空间的动态数组。

我们先在Python的IDE中创建一个列表,然后大致了解一下列表部分内置操作,我们先创建了一个名为test_list的列表,然后修改(插入或删除)元素,反转或清空列表,具体如下:

>>> test_list = [] # 创建名为test_list的空列表 >>> test_list.append("Hello") >>> test_list.append("World") >>> test_list ['Hello', 'World'] >>> test_list = ["Hello", "Array", 2019, "easy learning", "DataStructure"] # 重新给test_list赋值 >>> len(test_list) # 求列表的长度 5 >>> test_list[2] = 1024 # 修改列表元素 >>> test_list ['Hello', 'Array', 1024, 'easy learning', 'DataStructure'] >>> >>> test_list.insert(1, "I love") # 向列表中指定位置中插入一个元素 >>> test_list ['Hello', 'I love', 'Array', 1024, 'easy learning', 'DataStructure'] >>> test_list.append(2020) # 向列表末尾增加一个元素 >>> test_list ['Hello', 'I love', 'Array', 1024, 'easy learning', 'DataStructure', 2020] >>> >>> test_list.pop(1) # 删除指定位置的元素 'I love' >>> test_list.remove(2020) # 删除指定元素 >>> >>> test_list.index('Hello') # 查找某个元素的索引值 0 >>> test_list.index('hello') # 如果查找某个元素不在列表中,返回ValueError错误 Traceback (most recent call last): File "<pyshell#11>", line 1, in <module> test_list.index('hello') ValueError: 'hello' is not in list >>> >>> test_list.reverse() # 反转整个列表 >>> test_list ['DataStructure', 'easy learning', 2019, 'Array', 'Hello'] >>> test_list.clear() # 清空列表 >>> test_list []

我们看上面的代码,可以看到list的相关操作——增删改查,已经很强大了,还有一些内置方法这里并没有做展示,留给读者自己去发现并体验。

那么Python内置的list类是如何被实现的呢?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgdgsz.html