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

标签 python iterable-unpacking

这出现在 a recent PyCon talk .

声明

[] = []

没有任何意义,但它也不会抛出异常。我觉得这一定是由于拆包规则。你可以做tuple unpacking也有列表,例如,

[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 :

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);
}

tuples 有一个明确的检查长度不为零,并在它是时引发错误。 list 没有任何此类检查,因此不会引发异常。

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

关于python - 为什么分配给一个空列表而不是一个空元组是有效的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870019/

相关文章:

python - 字典更新序列元素 #0 的长度为 6; 2 是必需的

c++ - 按类型和歧义提取元组的元素

python - 将字典传递给具有 base_estimator 特征的 sklearn 分类器

python - 如何从 selenium webdriver 元素中提取链接?

python - 如何将 Ruby 模块移植到 Python

python - 如何使用 Python 和正则表达式从引文中提取页码?

python - 映射不解包元组

Python:在字符串中搜索变量重复字符

python - C 中的 "Unpacking"

python-3.x - 首先解构/解包,然后在 Clojure 中休息