我注意到两个列表构造函数之间存在一些奇怪的区别,我认为它们是等效的。
这是一个小例子:
hello = 'Hello World'
first = list(hello)
second = [hello]
print(first)
print(second)
此代码将产生以下输出:
['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']
['Hello World']
所以,两个构造函数之间的差异非常明显......而且,我猜这可以推广到其他构造函数,但我不理解它背后的逻辑。
有人可以对我的讯问进行抨击吗?
答案 0 :(得分:8)
list()
构造函数完全采用一个参数,该参数必须是 iterable 。它返回一个新列表,每个元素都是给定iterable中的一个元素。由于字符串是可迭代的(按字符),因此返回包含单个字符的列表。
[]
需要尽可能多的"参数"如你所愿,每个都是列表中的单个元素;这些物品没有经过评估"或迭代,它们按原样使用。
答案 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将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>]
很明显,第二种情况在大多数情况下都是不受欢迎的,也不是预期的。
P.S。
如果您使用的是Python 2,那么请从头开始:from itertools import imap as map
答案 5 :(得分:0)
first = list(hello)
将字符串转换为列表。
second = [hello]
这会将项目放入新列表中。它不是构造函数