match 'test':
case x, y, *z: # здесь не будет совпадения
print(x, y, z)
match map(int, '1234'):
case x, y, *z: # здесь тоже
print(x, y, z)
x, y, *z = 'test'
print(x, y, z) # t e ['s', 't']
x, y, *z = map(int, '1234')
print(x, y, z) # 1 2 [3, 4]
match range(1000000):
case x, *_, y: # здесь время потратится только на извлечение двух элементов
print(x, y) # 0 999999
# попытка вывести _ приведет к ошибке отсутствия соответствующей переменной
x, *_, y = range(1000000) # здесь - также на копирование последовательности в список `_`
print(_) # [1..99998]
因为 在您的情况下,只是变量名称与任何表达式成功匹配
match a:
case b:
# здесь b при сваеивается значение a
它是一样的
b = a
但如果你真的需要比较
a = 2
b = 2
match a:
case 1: print("1!")
case x if x == b: print("2!") #<-- так можно.
case 3: print("3!")
当然,比较的可能性并不限于此。将它们与数据类或其他实现相应功能的类一起使用特别方便
from dataclasses import dataclass
@dataclass
class Data:
x: bool
y: str
for rec in [Data(True, 'a'), Data(True, 'B'), Data(False, 'b')]:
match rec:
case Data(True, y) if y.islower():
print(y)
case _:
print(rec, "не совпадает")
a
Data(x=True, y='B') не совпадает
Data(x=False, y='b') не совпадает
match并没有实现比较,而是所谓的。模式匹配是函数式编程中非常常见的技术。
match 中的值与由文字、类名和变量组成的一种或多种模式进行匹配。第一个具有匹配模式的案例的主体将被执行,其余的将被忽略。在这种情况下,样本中的变量被分配了它们对应的值。
变量
x,y,在此位置rest创建。没有与他们进行比较。在某些方面,这种构造类似于普通的多重赋值
但有一些例外:
(x,y,z)如上例所示,像[x,y,z], ,x,y,z(这些是同义词)这样的模式不能映射到任意可迭代对象,只能映射到序列(实现 Sequence),字符串(和字节)除外。_是语法的一部分,而不是变量名,并且表达式的这一部分实际上被忽略,没有分配给任何东西,并且不会浪费时间复制它。因为 在您的情况下,只是变量名称与任何表达式成功匹配
它是一样的
但如果你真的需要比较
当然,比较的可能性并不限于此。将它们与数据类或其他实现相应功能的类一起使用特别方便
一如既往,Python 有点太聪明了。同一个匹配同时进行比较和赋值。
如果他将一个列表放入匹配中,并且如果他选择要解包的变量数量,则他会进行分配。
在您的情况下,不清楚是否应该完成分配或比较。