列表(a)和[a]之间有什么区别?

时间:2016-01-22 16:42:30

标签: python string list constructor

我注意到两个列表构造函数之间存在一些奇怪的区别,我认为它们是等效的。

这是一个小例子:

hello = 'Hello World'

first = list(hello)
second = [hello]

print(first)
print(second)

此代码将产生以下输出:

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

所以,两个构造函数之间的差异非常明显......而且,我猜这可以推广到其他构造函数,但我不理解它背后的逻辑。

有人可以对我的讯问进行抨击吗?

6 个答案:

答案 0 :(得分:8)

list()构造函数完全采用一个参数,该参数必须是 iterable 。它返回一个新列表,每个元素都是给定iterable中的一个元素。由于字符串是可迭代的(按字符),因此返回包含单个字符的列表。

[]需要尽可能多的"参数"如你所愿,每个都是列表中的单个元素;这些物品没有经过评估"或迭代,它们按原样使用。

一切as documented

答案 1 :(得分:2)

第一个只是将列表“Hello world”(一个字符数组)转换为列表

first = list(hello)

第二个用括号内的元素创建一个列表。

first = [hello]

在第二种情况下,您也可以这样做:

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

作为印刷品的输出,你将得到

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

答案 2 :(得分:1)

你的“第一个”使用list方法,它接受hello并将其视为可迭代的,将其转换为列表。这就是为什么每个人都是分开的。

你的“秒”创建一个新列表,使用字符串作为其值

答案 3 :(得分:1)

您假设list(hello)应该创建一个包含一个元素的列表,hello引用的对象。这不是真的;根据该逻辑,您希望list(5)返回[5]list接受一个 iterable 参数(列表,元组,字符串,字典等)并返回一个列表,其元素取自给定的可迭代。

但括号表示法不限于包含单个项目。每个以逗号分隔的对象都被视为新列表的不同元素。

答案 4 :(得分: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)

结果是:

[<map object at 0x00000209231CB2E8>]

很明显,第二种情况在大多数情况下都是不受欢迎的,也不是预期的。

P.S。 如果您使用的是Python 2,那么请从头开始:from itertools import imap as map

答案 5 :(得分:0)

first = list(hello)

将字符串转换为列表。

second = [hello]

这会将项目放入新列表中。它不是构造函数