You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

元组赋值底层工作原理?Python与Rust代码实例解惑

元组赋值的行为疑问与底层原理

测试场景与结果

Python 测试代码

l1 = [0,1]
l2 = [0,1]
a, b = 0, 1
(l1[a], l1[b], l2[l1[a]], l2[l1[b]]) = (l1[b], l1[a], a, b)
print(l1)
print(l2)

Python 实际运行输出

[1, 0]
[1, 0]

预期输出

我原本预期先将a、b的值代入整个表达式,得到:

(l1[0], l1[1], l2[0], l2[1]) = (l1[1], l1[0], 0, 1)

最终输出应为:

[1, 0]
[0, 1]

Rust 测试代码

fn main() {
    let mut l1 = [0,1];
    let mut l2 = [0,1];
    let (a, b) = (0, 1);
    (l1[a], l1[b], l2[l1[a]], l2[l1[b]]) = (l1[b], l1[a], a, b);
    println!("{:?}", l1);
    println!("{:?}", l2);
}

Rust 实际运行输出

[1, 0]
[1, 0]

行为推测

我猜测实际执行逻辑是:

  1. 先完整计算右侧的所有表达式,得到元组 (1, 0, 0, 1)
  2. 按顺序对左侧的每个目标执行赋值:
    l1[a] = 1
    l1[b] = 0
    l2[l1[a]] = 0  // 此时l1[a]已被修改为1,因此l2[1]被设为0
    l2[l1[b]] = 1  // 此时l1[b]已被修改为0,因此l2[0]被设为1
    

核心疑问

为什么会出现这种和预期不符的结果?元组赋值的底层工作原理是什么?


内容的提问来源于stack exchange,提问作者garam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 15:10:16