为什么分配给一个空列表而不分配给一个空元组是有效的?
这是在最近的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 ()
似乎拆包规则没有像列表一样适用于元组。对于这种不一致,我想不出任何解释。有这种现象的原因吗?
-
@
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
没有任何此类检查,因此没有引发异常。当分配给空元组是一个错误时,我没有看到允许分配给空列表的任何特殊原因,但是也许我没有考虑某些特殊情况。我建议这可能是一个(琐碎的)错误,并且两种类型的行为应相同。
-
将一个原始变量分配给另一个原始变量,而将参考变量分配给另一个
2021-01-30 关注 0 浏览126 1答案
-
为什么不分配一个空列表(例如[] =“”)错误?
2021-01-29 关注 0 浏览74 1答案
-
将空值分配给SqlParameter
2021-02-02 关注 0 浏览94 1答案
-
分配给一个用户的最小数据单位
2022-05-09 关注 0 浏览13 1答案
-
在Python中将一个变量的值分配给另一个变量时会发生什么?
2021-01-29 关注 0 浏览86 1答案
-
一个合法的IP地址在一个时刻只能分配给一台主机。
2022-05-11 关注 0 浏览30 1答案
-
为什么将对象分配给接口?
2021-01-30 关注 0 浏览85 1答案
-
为什么数组不能分配给Iterable?
2022-07-28 关注 0 浏览24 1答案
-
为什么数组不能分配给Iterable?
2021-02-02 关注 0 浏览85 1答案
-
一个合法的外部IP地址在一个时刻只能分配给一台主机。
2022-05-09 关注 0 浏览19 1答案