2013-07-14 38 views
3

試圖從分配像t = (("foo",),)一個變量的數據結構的值,我發現了以下工作:在Python中如何解開嵌套元組?

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

我不知道它是如何工作的。 Python是否在左側創建元組/列表?
也可以參考源文件中的相關部分。

回答

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;編譯器確定左側是嵌套序列,並將其編譯爲兩個字節碼。

這是所有記錄在assignment statement reference:根據目標(列表)的形式

分配被定義遞歸。

一個目的是目標列表的分配被遞歸地定義如下。

  • 如果目標列表是單個目標:將對象分配給該目標。
  • 如果目標列表是以逗號分隔的目標列表:對象必須是與目標列表中的目標具有相同數量項目的迭代項,並且項目從左到右分配給相應的目標。

一個目的是單個目標的分配遞歸地定義如下。

[...]

  • 如果目標是包含在括號或在方括號中的目標列表:該對象必須是一個可迭代具有相同數量的項作爲有在目標目標列表,其項目從左到右分配給相應的目標。

最後一部分特別告訴你,左側不被解釋爲Python列表或元組;它只是看起來一樣。

+0

「與目標列表中的目標數相同」。這在python2中是正確的。隨着python3中'*'-syntax的引入,它不再是真的了。 – Bakuriu

+0

@Bakuriu:這條規則在Python 3中有所擴展,是的,但這與這裏的問題不相關。我選擇專注於Python 2來保持簡單。如果您想查看Python 3的完整規則,只需調整參考文檔URL以使用3而不是2。 –