【发布时间】:2015-07-04 09:18:25
【问题描述】:
这出现在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 ()
似乎解包规则不适用于元组,因为它们适用于列表。对于这种不一致,我想不出任何解释。这种行为有原因吗?
【问题讨论】:
-
@ozgur 但使用元组解包确实有效:
a, b = 1, 2有效 ... -
我不确定,但我认为
[] = []没有拆包。但是,当我看到这是可行的时,我感到很惊讶:[a, b] = [1, 2]。相反,我会做a, b = (1, 2) -
我感觉这里不会有任何有趣的原则在起作用。最好的答案可能是“这是代码生成器的部分,它检查分配的 LHS 的有效性,这是捕获
()但让[]通过的检查”。可能是因为()被识别为常量什么的。 -
@ozgur 这与突变无关 - 同样的
[] = [1]和{} = {'a':1}也会引发错误。它可能 () 的行为就像方法本身。因为[].__add_([[]])结果[[]]但是,().__add__(((())))只是()。 -
有一个可追溯到 2015 年 1 月的 python bug,显示了 Python 源代码中的原因。请注意,根据文档,这两个分配都应该是非法的。讨论似乎略微倾向于允许分配给
()