使用 Python 3.11.0a2+ 和以下代码:
def my_fun(e):
match e:
case (1,):
print("tuple (1,)")
case [1]:
print("list [1]")
case _:
print("I don't understand")
使用my_fun([1])
调用函数会打印"元组 (1,)"。
这种行为正确吗?
如果我显式匹配tuple((1, ))
而不是(1,)
,它会按预期工作。
如果这不是解释器的错误,那么这种看似奇怪的行为背后的原因是什么?
这记录在结构模式匹配下。
与解包作业一样,元组和列表模式恰好具有 相同的含义,实际上匹配任意序列。从技术上讲, 主题必须是一个序列。因此,一个重要的例外是 模式与迭代器不匹配。此外,为了防止常见错误, 序列模式与字符串不匹配。
和 PEP 635 -- 结构模式匹配:动机和基本原理
与可迭代解包一样,我们不区分">元组"和 ">列表"表示法。
[a, b, c]
、(a, b, c)
和a, b, c
都是等价的。虽然这意味着我们有一个冗余的符号和检查 特别是对于列表或元组需要更多努力(例如list([a, b, c]))
,我们尽可能地模仿可迭代解包。