:= 是为避免重复计算和变量泄漏风险设计的赋值表达式,误用会增加复杂度;正确使用需注意优先级、作用域及是否真有必要复用结果。

:= 不是用来“简化结构”的装饰语法,它是为解决重复计算和变量泄漏风险而生的机制。用错地方反而让逻辑更难懂。
在 while 条件中读取并判断必须加括号
不加括号会触发优先级陷阱:while line := f().strip() != '' 实际等价于 while line := (f().strip() != ''),把布尔值赋给 line,不是你想要的结果。
- 正确写法是
while (line := f().strip()) != ''或更常见的while (line := f().strip()): - 读文件时注意
readline()返回'\n'或'',.strip()后空行变'',刚好能自然退出 - 用
next(it, sentinel)时,sentinel必须显式判等,比如while (chunk := next(it, None)) is not None:
if 中复用高开销函数结果要显式判 is not None
正则、字典查找、API 解析这类操作返回 None 表示失败,但有些函数(比如 int()、len())返回 0 或空容器也是 falsy —— 这时直接 if result := f(): 会误判。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 安全写法:
if (match := re.search(pattern, text)) is not None: - 对字典:
if (val := d.get('key')) is not None:,避免'key'对应0或False被跳过 - 别在条件里调用两次同一函数,比如
if get_user() and get_user().active:是典型反模式
列表推导式里用 := 只在「过滤+转换」且转换开销大时才值得
如果 transform(x) 很快(比如 str.lower()),用 := 反而增加括号噪声;只有当它涉及 IO、正则、JSON 解析或复杂计算时,收益才明显。
- 推荐场景:
[y for x in data if (y := heavy_parse(x)) and y.status == 'ok'] - 不推荐:
[x.upper() for x in words if (u := x.upper()).startswith('A')]——upper()太轻量,还多一层绑定 -
:=绑定的变量作用域是整个推导式,可在if和输出表达式里复用,但不能跨推导式共享
变量泄漏是设计特性,不是 bug
:= 在 if 或 while 条件中定义的变量,会留在当前作用域里——这是 Python 3.8+ 明确规定的,不是意外行为。
- 这意味着
if (n := len(lst)) > 5:之后,n直接可用,不用再算一遍 - 但也意味着别在嵌套作用域里滥用,比如在 lambda 或生成器表达式里用
:=,容易污染外层命名空间 - 最易被忽略的是:
for循环头部不支持:=,只能用while或推导式
:= 前,先问自己:这个表达式是不是真的会被重复求值?它的副作用是否可控?泄漏出来的变量名会不会干扰后续逻辑?Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










