如何解压嵌套元组在Python中工作?

时间:2013-07-14 15:58:15

标签: python variable-assignment

尝试将数据结构中的值(如t = (("foo",),))分配给变量,我发现以下方法有效:

((var,),) = t   # or [[var]] = t

我想知道它是如何运作的。 Python是否在左侧创建了元组/列表? 还将赞赏对来源中相关部分的提及。

1 个答案:

答案 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列表或元组;它只是看起来相同。