这出现在 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
s 有一个明确的检查长度不为零,并在它是时引发错误。 list
没有任何此类检查,因此不会引发异常。
当分配给空元组是错误时,我看不出允许分配给空列表的任何特殊原因,但也许有一些我没有考虑的特殊情况。我建议这可能是一个(微不足道的)错误,并且两种类型的行为应该相同。
关于python - 为什么分配给一个空列表而不是一个空元组是有效的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29870019/