CodeGym /课程 /Python SELF ZH /定长数组

定长数组

Python SELF ZH
第 52 级 , 课程 2
可用

9.1 定长数组的特点

定长数组 —— 这是在创建时确定大小的数组,并且 在程序运行中无法更改。在 Python 中,可以通过 array 创建定长数组,或者使用列表,尽管 Python 中的列表可以改变大小,但它们的用法与其他语言中的数组类似。

定长数组的特点:

  • 固定大小: 数组的大小在创建时设置,无法更改。
  • 单一类型: 数组中的所有元素必须是同一类型。
  • 快速索引访问: 可以在恒定时间内 O(1) 访问数组元素。
  • 大小不可变: 数组元素的数量保持不变,无法添加新元素。

在 Python 中创建定长数组的示例:

使用库 array:


import array

# 创建整数数组(类型 'i' 代表 int)
arr = array.array('i', [1, 2, 3, 4, 5])

# 访问元素
print(arr[2])  # 输出: 3

# 改变元素的值
arr[2] = 10
print(arr)  # 输出: array('i', [1, 2, 10, 4, 5])

使用列表(模拟定长数组):


# 创建固定大小的列表
arr = [0] * 5

# 初始化元素
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
arr[4] = 5

# 访问元素
print(arr[2])  # 输出: 3

# 改变元素的值
arr[2] = 10
print(arr)  # 输出: [1, 2, 10, 4, 5]

9.2 定长数组的优缺点

一切都有优缺点,定长数组也不例外。

优点:

  • 快速索引访问: 可以在恒定时间 O(1) 内访问数组中的任意元素,使得数组在读取数据时非常高效。
  • 实现简单: 数组易于理解和使用,可以轻松地在各种任务中实现和应用。
  • 内存使用高效: 由于数组大小是固定的,因此在创建时立即分配内存,避免了内存重新分配的开销。
  • 可预测性: 数组的固定大小简化了内存管理和资源使用的可预测性。

缺点:

  • 大小不可变: 数组的大小在创建时设置,无法更改。这意味着需要提前知道数组所需的大小,或有可能导致内存过度分配。
  • 插入和删除的成本: 插入和删除元素可能会消耗时间,因为需要移动元素。在最坏的情况下,在数组中间插入或删除元素需要 O(n) 的时间。
  • 内存使用不高效: 如果数组未完全使用,剩余的内存空间将保持未填充,这可能导致内存使用不高效。
  • 灵活性有限: 数组不允许动态更改大小,与动态数据结构(如列表)相比,它们的灵活性较差。

9.3 使用和应用示例

以下是一些定长数组的使用和应用示例。

示例 1: 表和矩阵

定长数组常用于表示表和矩阵,这些情况下大小是预先已知的。


import numpy as np

# 创建固定大小的 3x3 矩阵
matrix = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])

# 访问矩阵元素
print(matrix[1][2])  # 输出: 6

# 修改矩阵元素
matrix[1][2] = 10
print(matrix)
# 输出:
# [[ 1  2  3]
#  [ 4  5 10]
#  [ 7  8  9]]

示例 2: 缓冲区和缓存

定长数组用于创建缓冲区和缓存,其中缓冲区的大小是预先已知的且不变。


# 用于读取数据的固定大小缓冲区
buffer_size = 1024
buffer = bytearray(buffer_size)

# 将数据填入缓冲区
data = b"Hello, World!"
buffer[:len(data)] = data

print(buffer[:len(data)])  # 输出: b'Hello, World!'

示例 3: 存储时间和日期的数据

定长数组可以用于存储时间和日期的数据,比如每个月的天数。

在这个例子中,我们通过 list 类模拟定长数组的行为:


# 每个月的天数(非闰年)
days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

# 访问数据
month = 2  # 二月
print(f"二月有 {days_in_month[month - 1]} 天")  # 输出: 二月有 28 天
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION