【发布时间】:2023-02-21 23:18:53
【问题描述】:
我在 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)
结果是:
[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);
}
印刷
[1, 0]
[1, 0]
我对这种行为的猜测是: 只计算正确的表达式
(l1[a], l1[b], l2[l1[a]], l2[l1[b]]) = (1, 0, 0, 1)
然后分配是连续完成的:
l1[a] = 1
l1[b] = 0
l2[l1[a]] = 0 #l2[1] = 0
l2[l1[b]] = 1 #l2[0] = 1
为什么会这样?
【问题讨论】:
-
这样想想,语法不是简单的
a, b = x, y,连a, b = some_tuple都支持。如果您只写x, y,即使没有括号,它也会创建一个元组。鉴于您正在使用的语法的常用名称“tuple unpacking”,您显然需要先有一个元组才能解包。 -
如果你问的是 Python和Rust,这是两个不同的问题。请为这个问题选择一种语言。