分配是递归定义的,您需要 use parentheses () and/or square brackets [] to enclose target names 并匹配您的可迭代对象的嵌套结构。在你的情况下:
a, b, c, (d, (e, f)) = v
print(a, b, c, d, e, f)
1 2 3 4 5 6
同样,在语义不变的情况下,您可以使用[] 来表示结构:
a, b, c, [d, [e, f]] = v
print(a, b, c, d, e, f)
1 2 3 4 5 6
或者,当然,将它们混合起来。
然后Python将解压v并正常分配前3个值,然后解压(d, (e, f))的内容并分配d,然后再次解压(e, f)并执行相同操作。
如果您导入 dis 模块并使用 dis.dis 反汇编语句,您会看到这种情况:
dis.dis('a, b, c, (d, (e, f)) = v')
1 0 LOAD_NAME 0 (v)
3 UNPACK_SEQUENCE 4 # <- first unpack
6 STORE_NAME 1 (a)
9 STORE_NAME 2 (b)
12 STORE_NAME 3 (c)
15 UNPACK_SEQUENCE 2 # <- second unpack
18 STORE_NAME 4 (d)
21 UNPACK_SEQUENCE 2 # <- third unpack
24 STORE_NAME 5 (e)
27 STORE_NAME 6 (f)
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
一般来说,要解包任意嵌套的结构,匹配左边的结构赋值(target-list):
v = [1, [2, [3, [4, 5]]]]
[a, [b, [c, [d, e]]]] = v
print(a, b, c, d, e)
1 2 3 4 5
当然,外部[] 是不必要的,只需添加它们以表明只需匹配结构就足够了。