【Python基础:语法第四课】列表(list)和元组(tuple)详解
(2026最新实用版 · 0基础友好 · 结合AI学习路径)
这是Python语法系列的第四课,前三课我们已经掌握了变量、数据类型、输入输出、运算符、条件判断、循环和函数基础。今天重点学习列表和元组——Python中最常用、最重要的序列类型(有序集合)。
掌握它们后,你就能轻松处理成批数据,为后续学习NumPy、Pandas、AI数据处理、Ollama本地模型应用打下坚实基础。
1. 列表(list)和元组(tuple)核心区别
一句话记住:
- 列表(list):可变(像铅笔写的字,可以擦除重写),用中括号
[]创建。 - 元组(tuple):不可变(像用笔写的字,一旦写好不能改),用小括号
()创建。
| 特性 | 列表 (list) | 元组 (tuple) | 说明 |
|---|---|---|---|
| 可变性 | 可变(可增删改) | 不可变(创建后不能修改) | 最核心区别 |
| 创建方式 | [] 或 list() | () 或 tuple() | 元组单元素需加逗号 |
| 性能 | 稍慢 | 更快(内存占用更小) | 元组适合固定数据 |
| 用途场景 | 需要频繁修改的数据 | 固定配置、函数返回多个值、作为字典key | 推荐优先用元组(能用就用) |
| 是否允许重复 | 允许 | 允许 | 两者都支持 |
| 索引与切片 | 支持 | 支持 | 完全相同 |
为什么要有两种?
列表灵活但消耗更多资源;元组安全且高效。AI项目中,模型参数配置常用元组,训练数据常用列表。
2. 创建列表和元组
# 列表(可变)
empty_list = []
fruits = ["苹果", "香蕉", "橙子", "苹果"] # 允许重复
numbers = [1, 2, 3, 4.5, True, "文本"] # 类型可以不同
mixed = list(range(5)) # [0, 1, 2, 3, 4]
# 元组(不可变)
empty_tuple = ()
colors = ("红", "绿", "蓝")
single = (5,) # 重要!单元素元组必须加逗号,否则变成int
coords = tuple([10, 20, 30]) # 从列表转换
小技巧:用 type() 查看类型,用 len() 获取长度。
print(type(fruits)) # <class 'list'>
print(len(colors)) # 3
3. 共同操作:索引、切片、遍历(两者完全一样)
索引从 0 开始,支持负索引(-1表示最后一个)。
print(fruits[0]) # 苹果
print(fruits[-1]) # 苹果
print(fruits[1:3]) # ['香蕉', '橙子'] 切片:左闭右开
# 遍历
for fruit in fruits:
print(fruit)
# 带索引遍历(推荐)
for i, fruit in enumerate(fruits):
print(i, fruit)
4. 列表特有操作(可修改)
增:
fruits.append("芒果") # 末尾添加
fruits.insert(1, "葡萄") # 指定位置插入
fruits.extend(["西瓜", "樱桃"]) # 合并另一个可迭代对象
删:
fruits.remove("苹果") # 删除第一个匹配项
popped = fruits.pop() # 删除并返回末尾元素(默认)
del fruits[0] # 删除指定索引
fruits.clear() # 清空
改:
fruits[0] = "火龙果" # 直接修改
fruits[1:3] = ["梨", "桃"] # 切片替换
其他常用方法:
sort()/sorted():排序(原地 vs 新列表)reverse()/reversed():反转count(x):计数index(x):查找位置(不存在报错)copy():浅拷贝(重要!直接赋值是引用)
5. 元组操作(只能读,不能改)
元组没有 append、remove、pop 等修改方法。
但支持:
- 索引、切片、遍历、len()、count()、index()
- 打包与解包(超级实用!)
# 元组打包(自动)
point = 10, 20, 30 # 等价于 (10, 20, 30)
# 元组解包(最优雅的赋值方式)
x, y, z = point
print(x, y, z) # 10 20 30
# 部分解包 + 剩余用 *
a, *rest = (1, 2, 3, 4, 5)
print(a, rest) # 1 [2, 3, 4, 5]
# 函数返回多个值常用元组
def get_info():
return "张三", 25, "北京"
name, age, city = get_info()
6. 列表推导式(List Comprehension)—— Pythonic神器
一行代码生成新列表(2026仍是最常用技巧):
# 基础
squares = [x**2 for x in range(10)] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 带条件
even_squares = [x**2 for x in range(10) if x % 2 == 0]
# 嵌套(笛卡尔积)
pairs = [(x, y) for x in [1,2] for y in ['a','b']]
元组没有推导式,但可以用 tuple(生成器) 或列表推导后再转。
7. 嵌套与实际应用示例
# 嵌套列表(矩阵)
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
print(matrix[1][2]) # 6
# 学生信息(列表套元组,推荐:可修改整体,但单条记录不可变)
students = [
("小明", 18, "男"),
("小红", 17, "女")
]
# 遍历解包
for name, age, gender in students:
print(f"姓名:{name},年龄:{age}")
8. 常见坑 & 最佳实践(2026建议)
- 坑1:
a = b = []会让两个变量指向同一个列表,修改一个另一个也变。用copy()或list(b)。 - 坑2:元组单元素忘记逗号:
(5)是整数 5,不是元组。 - 坑3:列表作为函数默认参数(可变默认值陷阱)。
- 最佳实践:
- 数据不需要修改 → 优先用元组(更安全、更快)。
- 需要频繁增删改 → 用列表。
- 配置、坐标、函数返回值 → 用元组。
- 大量数据处理 → 后续学NumPy数组(比列表更快)。
9. 课后练习(立即动手,建议在VS Code + venv中完成)
- 创建一个水果列表,添加3个水果,删除第2个,排序后打印。
- 创建坐标元组
(3, 4),解包得到x、y,计算距离原点(用math.sqrt)。 - 用列表推导式生成
[1, 4, 9, 16, 25](1到5的平方)。 - 写一个函数,返回多个值(姓名、年龄、成绩),用元组解包接收并打印。
- (进阶)有一个列表
[1,2,3,4,5],用推导式生成只保留偶数并乘以10的新列表。
把练习代码写完后,运行测试,遇到问题可以直接问我!
本课结束!现在你已经掌握了Python最核心的两个序列类型。
下一课预告:字典(dict)和集合(set)——键值对与去重神器。
想看:
- 本课完整可运行代码文件
- 更多列表/元组面试题与AI应用示例(比如用列表存提示词、元组存模型配置)
- 嵌套列表转矩阵、深拷贝详解
- 结合Ollama的练习(让本地AI帮你生成列表操作代码)
随时告诉我,我立刻补充!继续加油,你正在快速打下Python + AI的坚实基础!🚀
(所有示例均在Python 3.12+测试通过,2026年语法无重大变化)