0

使用 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])使用打印“tuple (1,)”调用该函数。

这种行为正确吗?

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

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

4

1 回答 1

2

记录在结构模式匹配下。

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

并在PEP 635 -- 结构模式匹配:动机和基本原理

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

于 2021-11-23T08:18:59.297 回答