数组
一、什么是数组
❝数组是一种数据结构,是存放在连续内存中相同类型数据的集合
❞
二、特点
-
数组的下标是从0开始的
-
数组的内存空间是连续的
-
数组存储的是相同类型的数据
三、在python中的数组
❝在python严格来说没有传统意义上的“数组”这个数据结构,但有几种类似数组的结构可以使用,分别是List、Tuple、ndarray
❞
1、列表(List)
-
列表是一种内置的可变序列类型,可以存储「任意类型」的对象。
-
通过方括号
[]
或者list()
方法创建。 -
列表的大小可以动态变化(可以增加或删除元素)
# 创建列表 my_list = [1, 2, 3, "apple", True] # 访问列表元素 print(my_list[0]) # 输出:1 # 添加元素 my_list.append(4) print(my_list) # 输出:[1, 2, 3, "apple", True, 4] # 删除元素 my_list.remove("apple") print(my_list) # 输出:[1, 2, 3, True, 4]
1、python中的列表是如何实现的
❝python中的list其实是使用动态数(dynamic array)组实现的,其底层在Cpython解释器中是使用c语言实现。但是python中的列表是一个可变序列,可以存储任意类型的对象。
❞
-
动态数组允许在需要时自动扩展其大小以容纳更多元素。
-
底层还是使用连续的内存块来存储元素,当列表需要增长时,python会分配一个更大的内存块,并将现有元素复制到新内存块中。
-
数组创建时会预分配空间,当空间不足时,会重新申请空间,并把数据复制到新申请的空间中,一般情况下列表append是时间复杂度O(1),但是当需要扩容时是O(n)
2、疑问底层是数组实现,为何python中的列表元素可以支持不同类型的数据呢?
-
python是动态类型,变量和数据结构中的元素在运行时被检查类型,而不是在编译时;
-
python对象的类型信息和值是分开的,每个对象存在三要素,id、value、type;
-
「python列表中存储的是对象的引用,而不是值,这是list支持多类型的关键」
-
python中的所有数据对象都是基于PyObject对象,PyObject包含一个指向类型对象的指针和引用计数。
2、元组(Tuple)
-
元组是一种内置的不可变序列类型,也可以存储任意类型的对象
-
元组通过小括号
()
创建和tuple()创建 -
元组一旦创建,其内容不能更改
1、疑问元组和列表有什么区别,为何也可以支持多种类型数据结构?
❝
元组是不可变类型,一旦创建就不可以修改,列表是可变类型,可以修改元素。
元组的也是数组实现的,但是是固定大小的数组,和列表一样存储的是元素的引用对象,而不是值,所以也支持多种数据类型的存储
❞
3、NumPy数组(ndarray)
-
NumPy数组是一个强大的多维数组对象,由NumPy库提供,适用于数值计算。
-
NumPy中数据的类型是需要保持一致的,和列表和元组不同
数组结构
-
typedef struct {
PyObject_HEAD
char *data; // 指向数据的指针
int nd; // 数组的维度
npy_intp *dimensions; // 每个维度的大小
npy_intp *strides; // 每个维度的步长
PyObject *base; // 引用计数,避免内存被释放
PyArray_Descr *descr; // 数据类型描述
} PyArrayObject;