Python 列表构造与常见陷阱
本文是一份专为面试、写代码时快速查阅设计的 Python 列表构造指南,涵盖了初始化、拷贝、陷阱和推荐表达方式。
n
的空列表
🟢 一、基础构造:长度为 res = [''] * n # 字符列表,占位用
zeros = [0] * n # 全 0 列表
flags = [False] * n # 全 False 列表
- ✅ 推荐:高效且可索引赋值
- ❌ 注意:可变对象请小心(见陷阱)
🔵 二、二维列表初始化
✅ 正确写法(推荐)
matrix = [[0] * cols for _ in range(rows)]
❌ 错误写法(陷阱)
matrix = [[0] * cols] * rows # 所有行是同一个引用
问题:
matrix[0][0] = 1
print(matrix)
# 正确写法输出: [[1, 0, ...], [0, 0, ...], ...]
# 错误写法输出: [[1, 0, ...], [1, 0, ...], ...](全部都变了)
🟡 三、列表拷贝方式(避免引用错误)
a = [1, 2, 3]
b = a[:] # ✅ 浅拷贝
c = list(a) # ✅ 拷贝
d = a.copy() # ✅ 拷贝
e = a # ❌ 引用同一个对象(改一个全变)
a[0] = 99
print(b[0]) # 正确写法中 b[0] 仍为 1
print(e[0]) # e[0] 会变成 99
🟣 四、避免常见乘法陷阱
写法 | 解释 | 结果 |
---|---|---|
[''] * 3 | 正确,生成 ['', '', ''] | ✅ |
['' * 3] | 错误,相当于 [''] | ❌ |
[[]] * 3 | 错误,3 个引用指向同一个空列表 | ❌ |
[[] for _ in range(3)] | 正确,生成三个独立空列表 | ✅ |
🔴 五、空列表判断
if not lst: # ✅ 判断空列表
🟤 六、面试常用构造句型
用法 | 写法 |
---|---|
创建 n 个 None | [None] * n |
创建 n 个字典 | [{} for _ in range(n)] |
创建字符列表 | list(s) 将字符串转为列表 |
创建索引列表 | list(range(n)) |
创建二维布尔表 | [[False]*cols for _ in range(rows)] |