f-string是python 3.6+的语法级字符串格式化特性,仅支持表达式而非语句,不可赋值;需用{{}}输出字面量大括号;不支持跨行或拼接插值,且无模板引擎逻辑功能。

f-string 是 Python 3.6+ 中最直接、最快、也最容易出错的字符串格式化方式——它不是“更好用的 str.format()”,而是语法级特性,写错括号或表达式会直接报 SyntaxError,没法运行时兜底。
为什么 f-string 里不能写赋值语句(比如 a=1)?
f-string 的花括号内只接受表达式(expression),不接受语句(statement)。a = 1 是赋值语句,Python 解析器在构建 f-string 字面量阶段就拒绝它。
常见错误现象:SyntaxError: invalid syntax,光标停在等号位置。
- ✅ 正确写法:
f"{x + y}"、f"{len(items)}"、f"{name.upper()}" - ❌ 错误写法:
f"{a = 1}"(这是 Python 3.8+ 的调试语法f"{a=}",但必须带等号后缀,且仅用于调试输出) - ⚠️ 注意:
f"{a=}"是合法的(Python 3.8+),它等价于f"a={a}",但它是特殊语法糖,不是通用赋值
如何安全嵌套大括号(比如想输出 literal { 或 })?
f-string 要求成对的大括号:外层是 f-string 定界符,内层才是表达式容器。想输出字面量 { 或 },必须用双大括号 {{ 和 }} —— 单个大括号会被解析器当作表达式起始/结束,导致 ValueError 或 SyntaxError。
使用场景:生成 JSON 片段、LaTeX 模板、正则 pattern 等含大量字面量大括号的文本。
- ✅ 输出
{name}:f"{{{name}}}"→ 实际得到{Alice} - ✅ 输出纯字面量
{:f"{{";输出}}:f"}}" - ❌ 错误写法:
f"{name}"想输出{name}字面量?不行,它会尝试求值name变量
f-string 在多行字符串和字符串拼接中要注意什么?
f-string 本身不支持跨行定义(除非用括号隐式续行),也不能像普通字符串那样用 + 拼接多个 f-string 片段再插值 —— 因为每个 f"" 是独立解析的,变量作用域以所在 f-string 为界。
性能影响:多次拼接 f-string(如 f"a" f"b" f"{x}")比单个 f-string 更慢,且易引发作用域混淆。
- ✅ 推荐多行写法:
f""" Hello {name}, you have {count} messages. """ - ✅ 拼接推荐:
f"a{b}c{x}",而不是f"a" + f"{b}" + "c" + f"{x}" - ⚠️ 坑点:嵌套函数调用中用 f-string,注意变量是否在当前作用域可见 —— lambda 内、列表推导式内、或局部作用域提前 return 都可能让变量未定义
真正麻烦的不是语法本身,而是把 f-string 当成万能模板引擎来用:它不支持条件分支、循环展开、过滤器链。一旦需要这些,就得退回到 str.format() 或 jinja2,而不是硬塞三元表达式或生成器表达式进去 —— 可读性和维护性会断崖下跌。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











