[英]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將諸如map
和zip
類的東西轉換為生成器...
如果我們假設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.