这是在最近的PyCon演讲中提出的.
该声明
[] = []
Run Code Online (Sandbox Code Playgroud)
没有任何意义,但它也没有抛出异常.我觉得这一定是因为拆包规则.您也可以使用列表进行元组拆包,例如,
[a, b] = [1, 2]
Run Code Online (Sandbox Code Playgroud)
做你所期望的.作为逻辑结果,当解包的元素数为0时,这也应该有效,这可以解释为什么分配给空列表是有效的.当您尝试将非空列表分配给空列表时会发生什么,这进一步支持了这一理论:
>>> [] = [1]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
如果对于元组也是如此,我会对这个解释感到满意.如果我们可以解压缩到包含0个元素的列表,我们也应该能够解包为具有0个元素的元组,不是吗?然而:
>>> () = ()
File "<stdin>", line 1
SyntaxError: can't assign to ()
Run Code Online (Sandbox Code Playgroud)
似乎解包规则不适用于元组,因为它们用于列表.我想不出对这种不一致的任何解释.这种行为有原因吗?
In [55]: a = 5
In [56]: b = 6
In [57]: (a, b) = (b, a)
In [58]: a
Out[58]: 6
In [59]: b
Out[59]: 5
Run Code Online (Sandbox Code Playgroud)
如何交换a和b的值在内部工作?它肯定不使用临时变量.
我在我正在使用的代码中找到了类似的东西:
[], my_variable = my_function(a, b)
Run Code Online (Sandbox Code Playgroud)
my_function的输出如下:
return some_dict, some_list
Run Code Online (Sandbox Code Playgroud)
这似乎有效 - 系统的单元测试不会失败,但是当我在python控制台上尝试这个(将字典分配给"[]"时)它会引发:
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
你见过这样的东西吗?如何将字典(或其他内容)分配给空列表常量"[]"工作?
或者它没有,测试缺少一些东西......
我正在编写一些代码并犯了一个错字,但没有错误。回溯起来,我发现这些工作有效:
>>> [] = []
>>> () = ()
>>>
Run Code Online (Sandbox Code Playgroud)
这是可迭代的解包,但没有真正的分配目标。为什么 Python 允许这样做?在某些情况下这很有用吗?
这是在语法中定义的地方。我本以为你至少需要一个identifier、attributeref、subscription或slicing,但显然不需要;target_list在圆括号或中括号内是可选的。
target ::= identifier
| "(" [target_list] ")"
| "[" [target_list] "]"
| attributeref
| subscription
| slicing
| "*" target
Run Code Online (Sandbox Code Playgroud)
查看文档历史,这在最近的Python 3.4和2.6中是不可能的,但分配到是在Python 3.5和2.7以及Python 3.6中[]添加的。()
有关的:
注意:由于我询问的是设计选择,因此答案应包括对官方文档或核心开发等权威来源的引用。