海象运算符

海象运算符是指 :=,在 Python 3.8 中首次引入。
它的正式名称是 赋值表达式(Assignment Expression)

这个符号之所以被称为“海象运算符”,是因为它看起来像一个海象的眼睛和獠牙::=

基本作用

它的作用是:

在表达式内部进行赋值操作(即“边计算边赋值”)。

也就是说,你可以在一个表达式中给变量赋值,而不用单独写一行。

使用普通赋值

1
2
3
n = len(data)
if n > 10:
print(f"数据太长,有 {n} 个元素")

使用海象运算符

1
2
if (n := len(data)) > 10:
print(f"数据太长,有 {n} 个元素")

n := len(data) 会先计算 len(data),将结果赋给 n,然后返回这个值用于比较。

应用场景

在条件语句中减少重复计算

1
2
if (line := input("请输入: ")) != "exit":
print("你输入了:", line)

这样避免了写两次 input()

在循环中简化读取逻辑

常见的例子是读取文件或流:

1
2
while (line := file.readline().strip()):
print(line)

无需写成:

1
2
3
4
line = file.readline().strip()
while line:
print(line)
line = file.readline().strip()

列表推导式中避免重复计算

1
nums = [n for x in data if (n := f(x)) > 0]

相当于:

1
2
3
4
5
nums = []
for x in data:
n = f(x)
if n > 0:
nums.append(n)

简化复杂表达式逻辑

1
2
if (match := re.search(r"\d+", text)):
print("找到数字:", match.group())

注意事项

  1. 不能用于全局作用域的简单赋值

    1
    2
    # ❌ 不推荐
    x := 10 # SyntaxError

    必须出现在表达式内部,比如 ifwhileforreturn 等语句里。

  2. 不要滥用
    虽然可以写得更短,但如果让代码难读,就失去了意义。

    ✅ 好的用法:

    1
    2
    while (chunk := file.read(1024)):
    process(chunk)

    ❌ 不好的用法:

    1
    if (a := (b := func()) + (c := another())) > 10: ...

    这种写法让人费解。

与“普通赋值”对比

特性 普通赋值 = 海象运算符 :=
位置 独立语句 表达式中使用
返回值 无返回值 返回被赋的值
版本 所有版本 Python ≥ 3.8
用途 普通赋值 边赋值边使用