Python字符串不可变,s += 'x'循环性能差因每次全量拷贝;推荐list缓存后join;编码需匹配来源;re.sub默认只替换首个且不跨行;f-string编译期解析最高效。

str 类型不是“字符串对象的容器”,而是不可变的 Unicode 序列——所有看似修改的操作(如 replace()、upper())都返回新对象,原对象内存地址不变。
为什么 s += 'x' 在循环中性能极差?
因为每次 += 都触发一次新字符串分配 + 全量拷贝。10 万次拼接可能产生百万级字节复制。
- 用
list缓存片段,最后''.join(list)—— 这是 Python 官方推荐的高效拼接模式 -
io.StringIO适合多阶段构建,尤其配合print(..., file=buf) - 避免在
for循环里用+或+=拼接字符串,哪怕只有几轮
encode() 和 decode() 的编码参数到底怎么选?
核心原则:谁生成,谁声明;谁接收,谁适配。常见错误是硬写 'utf-8' 却忽略来源实际是 gbk(比如 Windows 记事本默认保存的中文文件)。
- 读文件时,明确用
open(path, encoding='gbk'),而不是靠str.encode().decode()补救 -
bytes.decode('utf-8', errors='ignore')会静默丢字符;生产环境优先用errors='replace'或捕获UnicodeDecodeError -
'utf-8-sig'编码可自动跳过 BOM,处理 Excel 导出的 CSV 更稳妥
正则中的 re.sub() 为什么有时不替换?
最常被忽略的是:默认只替换第一个匹配;且 ^ 和 $ 在多行模式外只匹配整个字符串首尾。
立即学习“Python免费学习笔记(深入)”;
import re text = "apple\nbanana\ncherry" # ❌ 不会换行匹配: re.sub(r'^b\w+', 'XXX', text) # 无效果 # ✅ 加 flags=re.MULTILINE 才生效: re.sub(r'^b\w+', 'XXX', text, flags=re.MULTILINE) # ✅ 替换全部匹配要加 count=0(默认是 1): re.sub(r'a\w+', 'YYY', text, count=0)
-
count参数默认为 1,想全替换必须显式写count=0 - 用
re.compile()预编译正则,重复调用时能省下解析开销 - 替换内容含反向引用(如
r'\1_\2')时,确保分组存在,否则抛IndexError
格式化字符串:f-string、format()、% 三者关键区别
f-string 是语法糖,编译期解析;format() 是运行时方法调用;% 已被标记为 legacy,新项目禁用。
- f-string 中不能有反斜杠
\、未闭合括号,也不能嵌套另一个 f-string -
'{:.2f}'.format(3.1415)支持位置/关键字混合,但f'{x:.2f}'不支持动态格式(如f'{x:.{n}f}'要拼接表达式) -
format()的!s/!r/!a修饰符,f-string 里得写成f'{str(x)}'/f'{repr(x)}'
字符串的“不可变性”和“编码边界”是多数 bug 的源头。写 encode 前先确认源字符集,做拼接前先判断是否真需要多次修改——这两点比记住多少方法名都重要。










