如果解包一个集合:
>>> a = {1,2,3}
>>> (x, y, z) = a
>>> x
1
>>> y
2
>>> z
3
那么为什么下面的不是?
>>> a = {1,2,3}
>>> match a:
... case (p, q, r):
... print(f'{p} {q} {r}')
...
>>>
我希望上面的代码输出"1 2 3"我理解集合不是有序的,如果两者都不行,我也不会感到惊讶,但前者行得通,只有后者不行。我一直认为模式匹配是基于拆包的。
这不是关于类型不匹配,因为如果我们将集合{1,2,3}替换为列表[1,2,3],即使我们使用元组语法解包,它也可以工作。
match
语句序列模式比序列解包具有更多的限制性规则。序列解包将尝试解包任何可迭代对象,但是序列模式被指定为要求
下列之一:
- 继承自
collections.abc.Sequence
的类- 已注册为
collections.abc.Sequence
的Python类- 一个内置类,它的
Py_TPFLAGS_SEQUENCE
位设置- 继承上述任何类的类(包括在父级
Sequence
注册之前定义的类)
set
不满足这些条件。
请注意,由于集合在语义上是无序的,因此如果试图解包集合,则无法保证哪些元素将分配给哪些变量。您的(x, y, z) = a
拆包不安全。