为什么分配给空列表有效但分配给空元组无效?

2024-03-11

这出现在最近的 PyCon 演讲 https://youtu.be/MCs5OvhV9S4?t=42m17s.

该声明

[] = []

没有做任何有意义的事情,但它也不会抛出异常。我感觉这一定是由于拆包规则造成的。你可以做元组拆包 http://openbookproject.net/thinkcs/python/english3e/tuples.html#tuple-assignment也有列表,例如

[a, b] = [1, 2]

做你所期望的。作为逻辑结果,当要解包的元素数量为 0 时,这也应该起作用,这可以解释为什么分配给空列表是有效的。当您尝试将非空列表分配给空列表时发生的情况进一步支持了该理论:

>>> [] = [1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many values to unpack

如果元组也是如此,我会对这个解释感到满意。如果我们可以解压到一个包含 0 个元素的列表,那么我们也应该能够解压到一个包含 0 个元素的元组,不是吗?然而:

>>> () = ()
  File "<stdin>", line 1
SyntaxError: can't assign to ()

似乎解包规则不适用于元组,因为它们适用于列表。我想不出对这种不一致的任何解释。这种行为有原因吗?


@user2357112 认为这似乎是巧合的评论似乎是正确的。 Python源代码的相关部分位于Python/ast.c https://hg.python.org/cpython/file/0351b0cb31d6/Python/ast.c#l916:

switch (e->kind) {
    # several cases snipped
    case List_kind:
        e->v.List.ctx = ctx;
        s = e->v.List.elts;
        break;
    case Tuple_kind:
        if (asdl_seq_LEN(e->v.Tuple.elts))  {
            e->v.Tuple.ctx = ctx;
            s = e->v.Tuple.elts;
        }
        else {
            expr_name = "()";
        }
        break;
    # several more cases snipped
}
/* Check for error string set by switch */
if (expr_name) {
    char buf[300];
    PyOS_snprintf(buf, sizeof(buf),
                  "can't %s %s",
                  ctx == Store ? "assign to" : "delete",
                  expr_name);
    return ast_error(c, n, buf);
}

tuple显式检查长度是否不为零,并在长度不为零时引发错误。list没有任何此类检查,因此不会引发异常。

当分配给空元组是错误时,我没有看到任何允许分配给空列表的特殊原因,但也许有一些我没有考虑的特殊情况。我建议这可能是一个(微不足道的)错误,并且两种类型的行为应该相同。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么分配给空列表有效但分配给空元组无效? 的相关文章

随机推荐

  • Android:在 Android 设备选择器中,同一设备会出现多次

    我正在使用 Eclipse 为 Android 操作系统编程 我使用真实设备来测试我的应用程序 为了测试我的应用程序 我单击 运行 然后单击我想要运行的目标项目 然后弹出 Android 设备选择器 我可以在其中选择要运行该应用程序的设备或
  • 脚本标签中的文本属性 - 澄清?

    在阅读 Angular 的指令代码时 我看到this https github com angular angular js blob master src ng directive script js L43 var scriptDire
  • SVG 在视网膜屏幕上作为边框图像

    请考虑我们有简单的 SVG 文件 其中包含圆角半径等于 10 的圆角矩形的代码
  • Delphi通用约束问题

    我正在尝试创建一个与 tiOPF delphi www tiopf com 的对象持久框架 一起使用的通用列表类 具体来说 我试图采用现有的泛型类 TtiObjectList 并制作一个使用 TtiObject 后代的泛型版本 我更改基类的
  • prolog中输入/输出参数的区别

    Prolog谓词定义中的输入和输出参数有什么区别吗 这与其他语言 例如Scheme 和C 相比如何 我希望我理解你的问题 您应该研究一下 Prolog 中如何实现统一 因为它会让事情变得更清晰 反正 简而言之 没有内置方法可以将 Prolo
  • 为什么我不能在类上下文中引用 DATA?

    在 Ruby 中 存储静态文本真的很方便 END 通过任意使用DATAIO对象 puts DATA read Prints This is the stuff END This is the stuff 然而 当我尝试从新类的上下文中引用
  • JavaScript 可以捕获语法错误吗?

    MDN 状态 https developer mozilla org en US docs Web JavaScript Reference Global Objects SyntaxError 当 JavaScript 引擎在解析代码时遇
  • 如何在父级中绑定子用户控件数据上下文

  • 在 R 的 JAGS 或 BUGS 中指定离散威布尔分布

    我使用 R 中的 JAGS 将威布尔模型拟合到离散值 将威布尔模型拟合到连续数据没有问题 但当我切换到离散值时 我遇到了麻烦 以下是在 JAGS 中拟合威布尔模型的一些数据和代码 draw data from a weibull distr
  • C++ 变量声明语法

    我最近遇到了这个结构 整数 米 这似乎相当于 整数米 奇怪的是 我以前从未见过这个特殊的成语 有人可以给我指出一个参考资料 我可以在其中阅读相关规范 或者直接解释一下吗 这也适用于直 C 吗 谢谢 困惑的开发者 这不是一个 习语 它只是一对
  • 使用数据注释进行模型验证的错误消息

    给定以下课程 using System ComponentModel DataAnnotations public class Book public Contact PrimaryContact get set public Contac
  • React JS 不支持 Html“align”属性

    我是 ReactJS 的新手 在反应组件中 我已经 var SaveOrganization React createClass render function return div align center a href addVenue
  • Nuxt 3 - 如何每n分钟刷新一次获取的数据

    因此 在我的数据库中 数据每分钟都会刷新 数据实际上更新 我检查过 然后我在页面上显示这些数据 当我在页面之间切换以及手动刷新页面时 数据会被获取 但如果我坐在一个页面上例如 5 分钟 即使数据库中的数据更新 数据也不会在页面端刷新 是否可
  • IE8 CSS 和 html 与 IE7 对比

    请原谅这里的任何鲁莽 我正无能为力地寻找答案 我正在寻找从 IE7 更改为 IE8 的特定 html 和 css 标签的列表 如果存在 或一些资源指南 具体来说 我想看到类似 此代码在 IE7 中有效 但在 IE8 中无效 这是损坏的标签相
  • Javascript document.getSelection

    我正在尝试使用 document getSelection 来选择我在所见即所得编辑器的文本区域中输入的文本 但只有当您选择文本区域之外的文本时 它才有效 不知道有没有办法让它选择文本区域内的文本 下面是所见即所得文本编辑器的文本区域 您需
  • 从按分钟计算的原始数据中按小时聚合 MySQL 数据

    我有一个表 table 1 其中包含每分钟的数据 如下所示 date time value 2015 06 05 18 00 00 222 663 2015 06 05 18 01 00 222 749 2015 06 05 18 02 0
  • Mac系统上检测框架使用情况?

    我想在 OSX 上开发示例框架 并要求在任何时候该框架只能由单个客户端使用 我不知道如何实现这一点 他们有 API 来检测框架正在使用的天气吗 我们可以为此使用一些与文件相关的 API 吗 我看过一个 Windows 示例 其中使用以下命令
  • 在 jQuery 1.8 中的自定义过滤器选择器中获取“匹配”对象

    作为参考 这里有一篇文章使用 jQuery 创建自定义过滤器选择器 http answers oreilly com topic 1055 creating a custom filter selector with jquery 介绍 对
  • 大型文本文件中的词频

    我试图读取一个大文本文件并输出其中的不同单词及其计数 到目前为止 我已经尝试了几次 这是迄今为止我想出的最快的解决方案 private static readonly char separators public IDictionary
  • 为什么分配给空列表有效但分配给空元组无效?

    这出现在最近的 PyCon 演讲 https youtu be MCs5OvhV9S4 t 42m17s 该声明 没有做任何有意义的事情 但它也不会抛出异常 我感觉这一定是由于拆包规则造成的 你可以做元组拆包 http openbookpr