[英]Extended sequence unpacking in python3
我創建一個列表:
>>> seq = [1, 2, 3, 4]
現在我分配變量如下:
>>> a, b, c, d, *e = seq
>>> print(a, b, c, d, e)
我輸出為:
>>> 1 2 3 4 []
現在我改變我將變量賦值為的順序:
>>> a, b, *e, c, d = seq
>>> print(a, b, c, d, e)
我輸出為:
>>> 1, 2, 3, 4, []
所以我的問題是為什么*上面的變量總是被分配一個空列表而不管它出現在哪里?
在第一種情況下
a, b, c, d, *e = seq
由於序列只有四個元素, a
, b
, c
和d
得到所有元素,其余的將存儲在e
。 由於序列中沒有任何內容, e
是一個空列表。
在第二種情況下,
a, b, *e, c, d = seq
前兩個元素將分別分配給a
和b
。 但是在*e
之后我們有兩個元素。 因此,最后兩個元素將分配給它們。 現在, seq
沒有任何東西了。 這就是為什么它再次得到一個空列表。
根據PEP 3132 (我的大膽),這是一個設計選擇:
簡單賦值左側的元組(或列表)(未為擴充賦值定義解包)最多可包含一個前綴為單個星號的表達式(此后稱為“已加星標”的表達式,而其他表達式則為該列表被稱為“強制”)。 這指定一個子表達式,該子表達式將被分配一個列表, 其中包含未被分配給任何強制性表達式的可迭代迭代的所有項目,或者如果沒有這樣的項目,則為空列表。
實際上,PEP中的第一個例子說明了你的觀點:
>>> a, *b, c = range(5)
>>> a
0
>>> c
4
>>> b
[1, 2, 3]
a, b, *e, c, d = [1, 2, 3, 4]
*e
說:“還剩下些什么投入e
”。 因為你有4個元素,所以將空序列放入e
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.