为什么分配给一个空列表而不分配给一个空元组是有效的?

发布于 2021-01-29 19:00:46

这是在最近的PyCon演讲中提出的

该声明

[] = []

没有任何意义,但是也不会引发异常。我觉得这一定是由于拆箱规则造成的。您也可以使用列表对元组进行解包,例如,

[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 ()

似乎拆包规则没有像列表一样适用于元组。对于这种不一致,我想不出任何解释。有这种现象的原因吗?

关注者
0
被浏览
73
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    @
    user2357112的评论似乎是巧合,这似乎是正确的。Python源代码的相关部分位于Python/ast.c

    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没有任何此类检查,因此没有引发异常。

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看