簡體   English   中英

list(a)和[a]有什么區別?

[英]What is the difference between list(a) and [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']

因此,這兩個構造函數之間的區別非常明顯...而且,我想這也可以推廣到其他構造函數,但是我無法理解其背后的邏輯。

有人可以對我的訊問投以光明嗎?

list()構造函數只接受一個參數,該參數必須是iterable 它返回一個新列表,其中每個元素都是給定iterable中的一個元素。 由於字符串是可迭代的(按字符),因此返回包含單個字符的列表。

[]可以根據需要選擇任意多個“參數”,每個參數都是列表中的單個元素; 這些項目不是“評估”或迭代的,它們按原樣使用。

一切都記錄在案

第一個只是將列表“ Hello world”(字符數組)轉換為列表

first = list(hello)

第二個創建一個在括號內包含元素的列表。

first = [hello]

例如,在第二種情況下,您還可以執行以下操作:

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

作為打印輸出,您將獲得

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

您的“第一個”使用list方法,該方法接受問候並將其視為可迭代的,並將其轉換為列表。 這就是每個字符分開的原因。

您的“第二個”使用字符串作為其值創建一個新列表

您假設list(hello)應該創建一個包含一個元素的列表,該元素由hello引用。 這不是真的; 按照這種邏輯,您期望list(5)返回[5] list接受一個可迭代的參數(列表,元組,字符串,字典等),並返回一個列表,該列表的元素均取自給定的iterable。

但是,括號符號不限於包含單個項目。 每個逗號分隔的對象都被視為新列表的不同元素。

使用生成器時,這兩種行為的最重要區別是。 鑒於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)

結果是:

[<map object at 0x00000209231CB2E8>]

顯然,在大多數情況下,第二種情況是不希望的,也是無法預期的。

PS:如果您使用的是Python 2,請from itertools import imap as map開始: from itertools import imap as map

first = list(hello)

將字符串轉換為列表。

second = [hello]

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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