元组赋值底层工作原理?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, 0, 0, 1) - 按顺序对左侧的每个目标执行赋值:
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
相关产品推荐
相关产品推荐

