3

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

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

我想知道它是如何工作的。Python 是否在左侧创建元组/列表?
参考来源中的相关部分也将不胜感激。

4

1 回答 1

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字节码。

这都记录在赋值语句参考中

赋值是根据目标(列表)的形式递归定义的。

将对象分配给目标列表递归定义如下。

  • 如果目标列表是单个目标:将对象分配给该目标。
  • 如果目标列表是逗号分隔的目标列表:该对象必须是与目标列表中的目标具有相同数量的项目的可迭代对象,并且项目从左到右分配给相应的目标。

将对象分配给单个目标的递归定义如下。

[...]

  • 如果目标是括在括号或方括号中的目标列表:该对象必须是与目标列表中的目标具有相同数量的项目的可迭代对象,并且其项目从左到右分配给相应的目标。

最后一部分特别告诉您,左侧不被解释为 Python 列表或元组;它只是看起来一样。

于 2013-07-14T16:00:39.023 回答