3
試圖從分配像t = (("foo",),)
一個變量的數據結構的值,我發現了以下工作:在Python中如何解開嵌套元組?
((var,),) = t # or [[var]] = t
我不知道它是如何工作的。 Python是否在左側創建元組/列表?
也可以參考源文件中的相關部分。
試圖從分配像t = (("foo",),)
一個變量的數據結構的值,我發現了以下工作:在Python中如何解開嵌套元組?
((var,),) = t # or [[var]] = t
我不知道它是如何工作的。 Python是否在左側創建元組/列表?
也可以參考源文件中的相關部分。
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列表或元組;它只是看起來一樣。
「與目標列表中的目標數相同」。這在python2中是正確的。隨着python3中'*'-syntax的引入,它不再是真的了。 – Bakuriu
@Bakuriu:這條規則在Python 3中有所擴展,是的,但這與這裏的問題不相關。我選擇專注於Python 2來保持簡單。如果您想查看Python 3的完整規則,只需調整參考文檔URL以使用3而不是2。 –