gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:59:31 25 4
gpt4 key购买 nike

这出现在 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);
}

tuple 明确检查长度是否为零,如果为零则引发错误。 list 没有任何此类检查,因此不会引发异常。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com