2016-01-22 123 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

相关问题