1. 用可变对象做函数默认参数
这是Python最经典的陷阱。def add(item, lst=[]):你以为每次调用都得到新列表,实际上所有调用共享同一个列表。正确做法是用None做默认值,函数内部再初始化。这个错误隐蔽性强,初学者几乎必中。
2. 在循环中修改列表
边遍历边删除元素,结果往往漏掉一些项。比如for x in lst: if cond: lst.remove(x),索引会错乱。稳妥的方式是遍历副本,或者用列表推导式生成新列表。
3. 混淆is和==
is比较身份,==比较值。小整数和短字符串因缓存可能碰巧相等,但大对象或动态生成的值就会翻车。判断相等用==,判断None用is None。别用is比较数值。
4. 忘记异常处理中的资源释放
打开文件不关,数据库连接不释放,时间一长资源耗尽。虽然with语句能解决大部分问题,但很多人还是习惯手动open然后忘记close。养成用上下文管理器的习惯,省心又安全。
5. 滥用全局变量
函数里想改外部变量,不加global会报错,加了又让代码难以追踪。全局变量越多,程序状态越混乱,测试越困难。尽量把状态封装在类或函数参数里,保持数据流清晰。
6. 忽视缩进和空格混用
Python靠缩进划分代码块,Tab和空格混用在不同编辑器下会引发IndentationError。统一用四个空格,配置编辑器自动转换。团队协作时,这一条尤其重要。
7. 用range(len())遍历列表
for i in range(len(lst)):虽然能跑,但不够Pythonic。直接for item in lst更简洁,需要索引时用enumerate。代码可读性提升,bug也少。
8. 对字典遍历时修改键
for k in d: del d[k]会直接报错。想过滤字典,用字典推导式或者遍历list(d.keys())。别在迭代过程中改变容器大小,这是所有语言的大忌。
9. 忽略GIL对多线程的影响
Python多线程适合IO密集型任务,CPU密集型用多进程。很多人兴冲冲写多线程想加速计算,结果发现比单线程还慢,就是因为全局解释器锁。选对并发模型,事半功倍。
10. 不写类型注解和文档字符串
小脚本无所谓,项目一大,没有类型提示和文档,接手的人苦不堪言。def process(data: list[dict]) -> bool:比光秃秃的函数签名清晰太多。类型注解还能配合mypy提前发现错误。
这十个错误,你中了几个?中了不可怕,可怕的是不知道自己在犯错。写代码就像修行,每改掉一个坏习惯,功力就长一分。