簡體   English   中英

python3中的擴展序列解包

[英]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

由於序列只有四個元素, abcd得到所有元素,其余的將存儲在e 由於序列中沒有任何內容, e是一個空列表。

在第二種情況下,

a, b, *e, c, d = seq

前兩個元素將分別分配給ab 但是在*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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM