今天在定义一个二维列表的变量类型时,发现了一个不理解的事情。
案发情景
需要定义的变量如下:
来看变量本体:
series = [
[0, 0, 5], [0, 1, 1], [0, 2, 0], [0, 3, 0], [0, 4, 0], [0, 5, 0], [0, 6, 0],
[1, 0, 7], [1, 1, 0], [1, 2, 0], [1, 3, 0], [1, 4, 0], [1, 5, 0], [1, 6, 0],
[2, 0, 1], [2, 1, 1], [2, 2, 0], [2, 3, 0], [2, 4, 0], [2, 5, 0], [2, 6, 0],
]
这个变量的格式:嵌套二维列表,最内层的列表包含三个元素,int类型。
第一感觉应该将变量定义为 List[List[int]]
,但是这样并不能凸显出内层列表的元素个数,故上网查了查GPT,GPT老师回答,应该定义为List[Tuple[int, int, int]]
。
👉疑惑: List和Tuple在python中是两种不同的数据类型,为什么可以这样定义?
取证
list:
✅特点
- 可变:创建后可以修改元素(添加、删除、更新)。
- 有序:元素有明确的顺序,可以通过索引访问。
📌常用场景:
- 存储一批可以变化的数据。
- 需要频繁修改、排序、追加的情况。
tuple:
✅特点:
-
不可变:创建后不能更改元素
-
有序:和列表一样有顺序,可以索引访问。
📌常用场景
-
表示结构化、固定格式的数据,如坐标、数据库行、键值对。
(每个字段具有特定的意义的记录)
-
用作字典的键(因为元组可哈希,但列表不行)。
temperature_map = { (0, 0): 25, (1, 0): 28, (0, 1): 22, }
特性 | list | tuple |
---|---|---|
可变性 | ✅ 可变(可增删改) | ❌ 不可变(定义后不能改) |
语法 | [1, 2, 3] | (1, 2, 3) |
适合场景 | 存储任意元素的可变序列 | 表示结构化、定长、不可变数据 |
是否可哈希 | ❌ 不可哈希,不能当字典的键 | ✅ 可哈希,可作为字典键、集合元素 |
示例用途 | 存储用户列表、动态数组等 | 坐标点(x, y) ,数据库行结构等每个位置有特定含义的数据 |
💡总而言之,若是值用来表示一个固定结构的记录,推荐用tuple。如果要对元素做增删改查,用list更合适。
结论
虽然实际数据依旧是用列表存储的(List[List[int]] 和 List[Tuple[int, int, int]] 在运行时都不影响),但:
在 类型注解的语义 层面,Tuple 明确表示:这个内层结构是一个定长、结构化的记录;
在 实际开发中,这种表达方式更有利于后期维护和理解;
由于此处定义变量类型,仅仅是为了标明数据的格式,以防出现乱七八糟的数据,所以采用List[Tuple[int, int, int]]
更合适。