无法理解Python的匹配案例

1 投票
1 回答
59 浏览
提问于 2025-04-14 18:24

为什么这两个例子给出的结果不一样呢?如果str()的值是''(也就是空字符串),那么结果应该是一样的。

    # example 1
    match 'ciao':
        case str():
            print('string')
        case _:
            print('default')
    
    # >>> string
    
    # example 2
    match 'ciao':
        case '':
            print('string')
        case _:
            print('default')
    
    # >>> default
    
    # but ...
    assert str() == ''

1 个回答

4

简而言之,case str(): 里面的 类模式 看起来像是一个函数调用,但作为模式,它可以匹配任何字符串,而不仅仅是空字符串。


在这个例子中,str() 其实 不是 一个会返回 '' 的函数调用。相反,它是一个 类模式,这种语法结构只在 match 语句中存在,和看起来相似的表达式有不同的含义。你可以在文档中了解更多关于类模式的信息,简单来说,str() 可以匹配任何 str 的实例。

match 'ciao':
    case str():
        print('string')
    case _:
        print('default')

等同于

if isinstance('ciao', str):
    print('string')
else:
    print('default')

同样,你在第二个 match 语句中的 '' 也不是一个会返回空字符串的表达式(虽然这个区别不那么重要,也不那么明显),而是一个字面模式,它专门用来匹配空字符串。

match 'ciao':
    case '':
        print('string')
    case _:
        print('default')

等同于

if 'ciao' == '':
    print('string')
else:
    print('default')

match 语句的一个强大之处在于,每个 case 可以使用不同类型的模式(实际上,在你的两个例子中,_ 是第三种类型,称为通配符模式),所以一般来说,把 match 语句转换成等效的 if 语句并不简单。

撰写回答