2016-01-22 128 views
1

我注意到兩個列表構造函數之間存在一個奇怪的差異,我相信它們是等價的。列表(a)和[a]之間有什麼區別?

這裏是一個小例子:

hello = 'Hello World' 

first = list(hello) 
second = [hello] 

print(first) 
print(second) 

此代碼將產生以下輸出:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'] 
['Hello World'] 

因此,所不同的是...在兩個構造之間很清晰,我猜這也可以推廣到其他構造函數,但是我沒有理解它背後的邏輯。

有人可以對我的審訊燈火通明嗎?

+3

你有沒有閱讀過文檔? https://docs.python.org/3.5/library/stdtypes.html#typesseq-list – deceze

+0

嘗試'[x for x in hello]' – imreal

回答

8

list()構造函數恰恰一個參數,它必須是一個迭代。它返回一個新的列表,每個元素都是給定迭代中的一個元素。由於字符串是可迭代的(按字符),因此返回具有單個字符的列表。

[]需要儘可能多的「參數」,每個都是列表中的單個元素;這些項目沒有被「評估」或迭代,他們被視爲是。

全部as documented

0
first = list(hello) 

將字符串轉換爲列表。

second = [hello] 

這將一個項目放入一個新的列表。它不是構造函數

1

您的「第一個」使用列表方法,該方法將hello視爲可迭代的,並將其轉換爲列表。這就是爲什麼每個chararcter是獨立的。

你的「第二」創建一個新的列表,使用字符串作爲其值

2

第一隻是變換列表中的「世界你好」(一個字符數組)到一個列表

first = list(hello) 

第二創建具有內部支架元件的列表。

first = [hello] 

在例如第二種情況下,你也可以這樣做:

first = [hello, 'hi', 'world'] 

和打印的輸出,你會得到

['Hello World', 'hi', 'world'] 
+0

輕微挑剔:'list()'不會改變任何東西;它只是用給定的迭代器創建一個新列表。 – chepner

1

你假設list(hello)應該創建一個列表包含一個元素,該對象由hello引用。這不是真的;通過這種邏輯,你會期望list(5)返回[5]list需要一個可迭代的參數(一個列表,一個元組,一個字符串,一個字典等)並返回一個列表,其元素來自給定的迭代。

但是,括號表示法不限於包含單個項目。每個逗號分隔的對象都被視爲新列表的獨特元素。

1

這兩個行爲最重要的區別來自您使用生成器。雖然Python 3轉換之類的東西mapzip到發電機...

如果我們假設map回報發電機:

a = list(map(lambda x: str(x), [1, 2, 3])) 
print(a) 

結果是:

['1', '2', '3'] 

但是,如果我們這樣做:

a = [map(lambda x: str(x), [1, 2, 3])] 
print(a) 

The結果是:

[<map object at 0x00000209231CB2E8>] 

很明顯,第二種情況在大多數情況下是不可取的和不可預料的。

P.S. 如果你在Python 2中,那麼在開頭:from itertools import imap as map

相關問題