为何Python元组解包可作用于无确定顺序的集合?
为何Python元组解包可作用于无确定顺序的集合?
咱们都知道Python里的集合是没有确定顺序的,但为啥元组解包还能对它生效呢?就像你在CPython 3.10.12里测试的这样:
a, b = {"foo", "bar"} # 结果是a = "bar", b = "foo" a, b = {"foo", "baz"} # 结果是a = "foo", b = "baz"
先给你个最直接的答案:Python的元组解包本质上只要求被操作的对象是可迭代的——不管你有没有确定顺序,只要能逐个吐出元素,就能被解包。比如你写个生成器函数,照样能这么玩:
def f(): yield 1 yield 2 a, b = f()
那你肯定会问了:那为啥解包的时候不额外加个检查,确保被解包的对象有确定顺序呢?这就得说到Python的设计哲学了:
- 首先,Python奉行“鸭子类型”——只要你能迭代(有
__iter__或者__getitem__方法),我就认你,不搞多余的身份验证; - 其次,“有确定顺序”这个标准太模糊了,有些对象的顺序可能在特定场景下稳定,换个环境就变了,很难给语言层面的检查定一个清晰的规则;
- 再者,额外的检查会增加运行时的开销,违背了Python追求简洁高效的原则;
- 最后,Python相信开发者能对自己的代码负责——如果你明知道集合是无序的还要去解包,那你就得接受结果的不确定性,语言不会做这种“过度保护”的事。
备注:内容来源于stack exchange,提问作者Zags
相关产品推荐
相关产品推荐

