这出现在最近的 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(使用前将#替换为@)