




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() 为什么有时不替换?最常被忽略的是:默认只替换第一个匹配;且 ^ 和 $ 在多行模式外只匹配整个字符串首尾。
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
format()、% 三者关键区别
f-string 是语法糖,编译期解析;format() 是运行时方法调用;% 已被标记为 legacy,新项目禁用。
\、未闭合括号,也不能嵌套另一个 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 前先确认源字符集,做拼接前先判断是否真需要多次修改——这两点比记住多少方法名都重要。