详解Python中列表和数组的区别

  • Post category:Python

在Python中,列表和数组都是常见的数据结构,两者都可以用来存储多个值,并且都支持索引、遍历和操作等基本操作。但是,它们之间还是有着一些区别的。

列表和数组的定义

在Python中,列表(List)是动态数组,它可以存储不同类型的元素,并且可以随时修改。从实现上来说,列表是由指向列表中各个元素的指针及元素类型及长度组成的一个结构体数组。

数组(Array)是一种特殊的数据结构,它由相同类型的元素组成,而且在内存中是连续存储的。Python中并没有严格意义上的数组,但是通过导入NumPy库可以使用相似的结构——NumPy数组,它是由相同类型的元素组成,而且在内存中是连续存储的。

列表和数组的区别

下面介绍一些常见的列表和数组在使用时的区别。

内存空间的使用

在 Python 中,列表可以存储不同类型的元素,而数组的元素必须是相同的类型。

列表在内部是由指针和长度等组成的数据结构,因此在存储元素时需要额外的空间来存储这些属性。举个例子,当我们存储一个包含 10 个整数的列表时,会占用更多的空间(40字节)。

# 创建列表
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 输出列表元素占用的内存空间
print(f"列表 my_list 共占用了 {my_list.__sizeof__()} 字节")

相比之下,数组只需要按照数据类型分配合适的内存大小,不会存储其他关于数组的属性。

# 导入 NumPy 库
import numpy as np

# 创建整型数组
my_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

# 输出数组元素占用的内存空间
print(f"数组 my_array 共占用了 {my_array.nbytes} 字节")

操作和功能的不同

列表和数组之间的另一个重要区别是它们支持的操作和功能。其中,一些功能可以在列表和数组中都使用,另一些只能在其中之一或另一种数据结构中使用。

例如,列表支持以下操作:

  1. 通过索引访问元素
  2. 将列表相加 (+)
  3. 列表的切片操作
  4. 列表展开与压缩
  5. 列表排序

而数组支持以下操作:

  1. 四则运算操作(加减乘除)
  2. 数组之间的运算操作
  3. 数组的型判断
  4. 数组转换操作

示例:

# 列表相加操作
list1 = [1, 2, 3]
list2 = [4, 5, 6]
concatenated_list = list1 + list2
print(f'列表拼接结果:{concatenated_list}')

# 列表切片操作
slice_list = concatenated_list[2:5]
print(f'列表切片结果:{slice_list}')

# 数组的四则运算(加减乘除)
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
add_result = array1 + array2
print(f'数组加法结果:{add_result}')
subtract_result = array2 - array1
print(f'数组减法结果:{subtract_result}')
multiply_result = array1 * array2
print(f'数组乘法结果:{multiply_result}')
divide_result = array2 / array1
print(f'数组除法结果:{divide_result}')

再举一个例子,如果我们要计算两个向量的点积(对两个向量对应元素的乘积求和),则可以通过列表和数组分别实现。其中,用列表实现比较麻烦,需要用到zip和sum等内置函数,而用数组实现则非常简单。

# 计算向量点积
# 列表方式实现
list1 = [1, 2, 3]
list2 = [4, 5, 6]
dot_product = sum(i * j for i, j in zip(list1, list2))
print(f'向量的点积结果:{dot_product}')

# 数组方式实现
array1 = np.array([1, 2, 3])
array2 = np.array([4, 5, 6])
dot_product = np.dot(array1, array2)
print(f'向量的点积结果:{dot_product}')

以上是关于Python中列表和数组的区别的详细讲解。总的来说,列表主要用于存储不同类型的数据,而数组主要用于存储相同类型的数据。此外,列表和数组在支持的操作和功能上存在差异,具体取决于应用场景和使用需求。