为何Python的match/case语句对类/对象成员不生效?
Python match/case中对象成员与普通变量匹配行为差异的原因
这是Python模式匹配的规则设计差异导致的,核心在于case后跟随的内容属于不同的模式类型:
普通变量名(全局/局部):绑定捕获模式
当case后面直接跟一个单纯的变量名(比如globl、local)时,Python会把这个模式当作绑定模式——它的作用不是判断值是否相等,而是把当前匹配的v的值赋值给这个变量,然后无条件触发该case分支。
对应你的代码:- 调用
check(1)时,case globl:会把globl重新赋值为1,然后执行print,所以你会看到输出1 globl OK 1; - 调用
check(3)时同理,globl被赋值为3,输出3 globl OK 3。
- 调用
对象成员/属性访问:值匹配模式
当case后面是属性访问表达式(比如m.val)、下标访问或者其他复杂表达式时,Python会先计算这个表达式的当前值,然后把它当作字面量值模式使用——只有当v和这个计算出的值相等时,才会触发case分支。
对应你的代码:m.val被初始化为2,所以只有当v=2时,case m.val:才会匹配成功,输出2 m.val OK 2;当v=1或3时,因为值不相等,所以不会触发这个分支。
补充:如果想让普通变量也做值匹配怎么办?
如果你希望用普通变量的值来做匹配(而不是捕获),可以用条件守卫的方式:
match v: case _ if v == globl: print(v, 'globl value matched', globl)
或者把变量定义为模块级常量(大写命名),Python会自动将其识别为值模式(这是基于命名约定的启发式规则)。
内容的提问来源于stack exchange,提问作者Snild Dolkow
相关产品推荐
相关产品推荐

