尝试将数据结构中的值(如t = (("foo",),)
)分配给变量,我发现以下方法有效:
((var,),) = t # or [[var]] = t
我想知道它是如何运作的。 Python是否在左侧创建了元组/列表? 还将赞赏对来源中相关部分的提及。
答案 0 :(得分:4)
Python将从右侧递归解压缩值。
没有创建元组。相反,编译器会解释左侧的语法,以确定如何从右侧分配序列。
要查看此操作,请反汇编分配代码:
>>> def foo():
... ((var,),) = t
...
>>> import dis
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (t)
3 UNPACK_SEQUENCE 1
6 UNPACK_SEQUENCE 1
9 STORE_FAST 0 (var)
12 LOAD_CONST 0 (None)
15 RETURN_VALUE
此处t
已解压缩两次以存储在var
中;编译器确定左侧是嵌套序列,并将其编译为两个UNPACK_SEQUENCE
字节码。
这些都记录在assignment statement reference:
中根据目标(列表)的形式递归定义赋值。
和
将对象分配给目标列表按递归方式定义如下。
- 如果目标列表是单个目标:该对象将分配给该目标。
- 如果目标列表是以逗号分隔的目标列表:对象必须是与目标列表中的目标具有相同项目数的可迭代对象,并且项目将从左到右分配到相应的目标。
和
将对象分配给单个目标按递归方式定义如下。
[...]
- 如果目标是括在括号中或方括号中的目标列表:对象必须是一个可迭代的项目数与目标列表中的目标相同,并且其项目从左到右分配,到相应的目标。
最后一部分特别告诉你左侧不被解释为Python列表或元组;它只是看起来相同。