为什么 Python 将列表匹配为元组?

Joh*_* Li 4 python tuples list pattern-matching python-3.10

使用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")
Run Code Online (Sandbox Code Playgroud)

使用my_fun([1])打印“tuple (1,)”调用该函数。

这种行为正确吗?

如果我明确匹配tuple((1, ))而不是(1,),它会按预期工作。

如果这不是解释器的错误,那么这种看似奇怪的行为背后的原因是什么?

Abd*_*P M 6

这记录在结构模式匹配

\n
\n

与解包作业一样,元组和列表模式具有完全相同的含义,并且实际上匹配任意序列。从技术上讲,主题必须是一个序列。因此,一个重要的例外是\n模式不\xe2\x80\x99 匹配迭代器。另外,为了防止常见错误,\n序列模式不\xe2\x80\x99 匹配字符串。

\n
\n

以及PEP 635——结构模式匹配:动机和基本原理

\n
\n

与可迭代拆包一样,我们不区分“元”和“列表”表示法。[a, b, c](a, b, c)并且a, b, c都是等价的。\n虽然这意味着我们有冗余的符号,并且\n专门针对列表或元组进行检查需要更多的努力(例如 case\n )list([a, b, c])),但我们尽可能地模仿可迭代的解包。

\n
\n