使用list和tuple
1. list(列表)- 可变有序集合
基本概念
- 定义:有序集合,可以随时添加和删除元素
- 特点:可变(mutable)
classmates = ['Michael', 'Bob', 'Tracy']
访问元素
- 索引访问:从
0开始 - 负索引:
-1表示最后一个元素,-2表示倒数第二个,以此类推
classmates[0] # 'Michael'
classmates[-1] # 'Tracy'(最后一个)
classmates[-2] # 'Bob'(倒数第二个)
注意:索引越界会报 IndexError
常用操作
添加元素
# 追加到末尾
classmates.append('Adam')
# 插入到指定位置
classmates.insert(1, 'Jack') # 插入到索引1的位置
删除元素
# 删除末尾元素
classmates.pop() # 返回被删除的元素
# 删除指定位置元素
classmates.pop(1) # 删除索引1的元素
替换元素
classmates[1] = 'Sarah' # 直接赋值替换
特殊特性
- 元素类型可以不同:
L = ['Apple', 123, True]
- 可以嵌套(二维数组):
s = ['python', 'java', ['asp', 'php'], 'scheme']
s[2][1] # 'php'(访问嵌套list)
- 空list:
L = []
len(L) # 0
2. tuple(元组)- 不可变有序列表
基本概念
- 定义:有序列表,一旦初始化就不能修改
- 特点:不可变(immutable)
- 优势:代码更安全,能用 tuple 代替 list 就尽量用
classmates = ('Michael', 'Bob', 'Tracy')
访问元素
与 list 相同,可以使用索引和负索引:
classmates[0] # 'Michael'
classmates[-1] # 'Tracy'
注意:不能赋值修改,没有 append()、insert() 等方法
定义方式
正常定义
t = (1, 2, 3)
空tuple
t = ()
单元素tuple(重要陷阱)
# ❌ 错误:这不是tuple,是数字1
t = (1)
t # 1
# ✅ 正确:必须加逗号
t = (1,)
t # (1,)
记忆:单元素 tuple 必须加逗号,否则会被当作括号表达式
"可变的"tuple 陷阱
t = ('a', 'b', ['A', 'B'])
t[2][0] = 'X' # ✅ 可以修改
t[2][1] = 'Y' # ✅ 可以修改
t # ('a', 'b', ['X', 'Y'])
核心理解:
- tuple 的指向不变:每个元素指向的对象不能改变
- 但指向的对象本身可变:如果元素是 list,list 的内容可以修改
图解:
tuple -> ['a', 'b', list对象]
↓
list对象本身可变
要创建完全不可变的 tuple,必须保证每个元素本身也不可变。
3. 对比总结
| 特性 | list | tuple |
|---|---|---|
| 可变性 | ✅ 可变 | ❌ 不可变 |
| 定义 | [] | () |
| 添加元素 | append(), insert() | ❌ 不支持 |
| 删除元素 | pop() | ❌ 不支持 |
| 修改元素 | ✅ 支持 | ❌ 不支持 |
| 安全性 | 较低 | 较高 |
| 使用场景 | 需要修改的集合 | 固定不变的集合 |
4. 快速记忆口诀
- list:方括号
[],可变,增删改查都支持 - tuple:圆括号
(),不可变,单元素要加逗号 - 选择原则:能用 tuple 就用 tuple,更安全
- 陷阱记忆:tuple 指向不变,但指向的对象可变(如 list)
5. 常见操作速查
list 操作
L = ['a', 'b', 'c']
# 访问
L[0] # 'a'
L[-1] # 'c'
# 添加
L.append('d') # ['a', 'b', 'c', 'd']
L.insert(1, 'x') # ['a', 'x', 'b', 'c', 'd']
# 删除
L.pop() # 'd',L变为['a', 'x', 'b', 'c']
L.pop(1) # 'x',L变为['a', 'b', 'c']
# 修改
L[0] = 'A' # ['A', 'b', 'c']
# 长度
len(L) # 3
tuple 操作
t = ('a', 'b', 'c')
# 访问
t[0] # 'a'
t[-1] # 'c'
# ❌ 不支持修改
# t[0] = 'A' # TypeError
# 长度
len(t) # 3