2015-10-02 136 views
2
n1, n2, n3 = (n + [None]*2)[:3] 

我只是很簡單地想知道這是幹什麼的,它是如何工作的。 這就像一個列表理解,只要我提供一個列表或具有足夠的變量迭代它會分配n1 = iterable [0]?需要翻譯此代碼

爲什麼在括號末尾有[:3]限制長度?

我明白爲什麼[無]在那裏,以防萬一n的長度小於3,但有人能給我多一點信息?

我只編了一個星期左右,需要一些幫助解釋。

+0

FWIW,'n' _應該是一個列表(或者一個合適定義的自定義對象)。它不能只是任何迭代。例如,如果'n'是一個元組,你將得到'TypeError:只能連接元組(而不是「list」)爲元組。同樣,如果'n'是一個字符串,它將不起作用。 –

回答

7

這需要n的前三個元素,如果元素少於三個,則填充爲None

(n + [None]*2)串接的[None, None]清單,清單n,正如你說的,[:3]取前三個項目所產生的名單。然後將這三個項目解壓縮到變量n1,n2n3

例如:

In [1]: n = ['One', 'Two'] 

In [2]: n1, n2, n3 = (n + [None]*2)[:3] 

In [3]: print n1 
One 

In [4]: print n2 
Two 

In [5]: print n3 
None 

但如果n它有三個或更多的物品,你只得到這三個項目爲n1n2n3

正如其他人在下面指出的,如果n是空列表,則此代碼將失敗,因爲(n + [None]*2)將只包含兩個項目。它可以被切片確定:​​返回一個列表與這兩個項目,但然後拆包到三個變量失敗。在這種情況下產生的ValueError是否是要提出的意外例外,或者代碼是否應該是n1, n2, n3 = (n + [None]*3)[:3]以便將None返回到每個變量中,這只是原始程序員知道的。這通常會在代碼中發表評論。

+0

'n'應該列出。如果你提到 – FallenAngel

+0

真的,那會很好,那個:我已經擴大了我的答案。儘管'n'並不是一個真正的海外名單, – xnx

+0

可能值得一提的是,如果'n'是空列表,那麼'(n + [None] * 2)[:3]'將會成功,導致'[None,None]',但是隨後解包到元組'n1,n2,n3'將會失敗。 –

3

這不是列表理解。據推測,n是一個列表,or anything that can be the left-operand of concatenation by the + operator when called with the suitable right-operand, under suitable implementation of __add__ or __radd__。列表上的+運算符將它們連接在一起以創建一個新列表,而[:3]部分僅僅是獲取列表片段的語法。你真的應該看看documentation

+0

我知道你的意思,然而'n + [None] * 2'的結果不是必須的連接:如果' n'是具有適當的__add__方法的類的實例,那麼'n + some_list'可以返回類的實現者想要的任何東西。 –

+0

好吧,它並不像所有那樣普遍:當第二個操作數是一個列表時,''n'可以是'+'操作符*的第一個*操作數* - 這裏,'[None] * 2' 。它不能是一個元組,例如(引發TypeError)。 – BrianO

+0

@ PM2Ring我並不是暗示它必然是串聯的。 –