RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1554439
Accepted
ugorek
ugorek
Asked:2023-12-04 03:37:58 +0000 UTC2023-12-04 03:37:58 +0000 UTC 2023-12-04 03:37:58 +0000 UTC

为什么我们不能使用常量进行匹配?

  • 772

我正在查看问题的答案,然后发现它match与常规开关不一样。

例子:

a = 2
b = 2

match a:
    case 1: print("1!")
    case b: print("2!") #<-- так нельзя.
    case 3: print("3!")

他们也到处建议使用“点表示法”来解决这个问题。他们甚至展示了它是如何在那里工作的。

好吧,这当然很酷,但它看起来只是通常的“低级”解释,比如“这样做,不用担心”。

但我从哪里可以获得更高层次的解释呢?

在 python 中无法使用常量进行匹配背后的概念是什么?

python
  • 2 2 个回答
  • 85 Views

2 个回答

  • Voted
  1. Best Answer
    extrn
    2023-12-04T15:54:14Z2023-12-04T15:54:14Z

    match并没有实现比较,而是所谓的。模式匹配是函数式编程中非常常见的技术。

    match 中的值与由文字、类名和变量组成的一种或多种模式进行匹配。第一个具有匹配模式的案例的主体将被执行,其余的将被忽略。在这种情况下,样本中的变量被分配了它们对应的值。

    lst = [1, 2, 3, 4, 5, 6]
    
    match lst:
        case [x, _, y, _, *rest]:
            print(x, y, rest) # 1 3 [5, 6]
    

    变量x, y,在此位置rest 创建。没有与他们进行比较。

    在某些方面,这种构造类似于普通的多重赋值

    [x, _, y, _, *rest] = lst
    print(x, y, rest) # 1 3 [5, 6]
    

    但有一些例外:

    • 如果表达式与模式不匹配,则不会发生错误
    match [1]:
        case x, y, z: # эта ветка проигнорируется
            pass
    
    x, y, z = [1] # ошибка
    
    • (x,y,z)如上例所示,像[x,y,z], , x,y,z(这些是同义词)这样的模式不能映射到任意可迭代对象,只能映射到序列(实现 Sequence),字符串(和字节)除外。
    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') не совпадает
    
    • 8
  2. eri
    2023-12-04T04:01:21Z2023-12-04T04:01:21Z

    一如既往,Python 有点太聪明了。同一个匹配同时进行比较和赋值。

    如果他将一个列表放入匹配中,并且如果他选择要解包的变量数量,则他会进行分配。

    在您的情况下,不清楚是否应该完成分配或比较。

    • 4

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5