在Python 2.7中,var1 = [list(range(6))]和var2 = range(6)之间有什么区别?

时间:2014-04-13 17:23:30

标签: python python-2.7

在LPTHW的ex32中,我发现我可以通过这样做来制作一个列表:

var1 = [list(range(6))]

var2 = range(6)

但是,当我使用'%d'在for-loop中打印var1时我得到一个typeError说它想要一个不是列表的数字。同时var2 打印使用'%d'。我如何构造var1以要求特定的格式说明符?

3 个答案:

答案 0 :(得分:2)

让我们重复一些案例:

range(6)

这会产生一个列表[0, 1, 2, 3, 4, 5]

list(range(6))

list()需要一个可迭代对象,并将其转换为列表。因此list(range(6))获取range(6)返回的列表,并将其成员复制到新列表中。我们得到[0, 1, 2, 3, 4, 5]

[range(6)]

这使用python列表创建语法。这将把括号内的每个参数放在一个列表中。所以我们得到:[ [0, 1, 2, 3, 4, 5] ]。请注意,这是一个列表列表。

[list(range(6))]

在这里,我们应该知道会发生什么。或多或少,range(6)list(range(6))执行相同的操作,因此我们希望获得与上一行相同的结果,因此我们看到:[ [0, 1, 2, 3, 4, 5] ]

关于python3.x的注释

Python 3试图使内部函数返回更多惰性对象或迭代器。所以range(6)没有在python 3.x中返回一个列表。相反,它返回一个自定义范围对象。可以通过执行list(range(6))将此对象转换为列表,因为它可以迭代。但是,如果您不需要改变返回的对象,那么将它保留为范围对象可能是有意义的。

答案 1 :(得分:1)

var1的错误在于你确实有2d list。通过将整个事物放在方括号中,您实际上创建了一个带有单个元素的外部list。这是导致错误的原因,因为一个元素也是list

>>> list(range(6))
[0, 1, 2, 3, 4, 5]
>>> [list(range(6))]
[[0, 1, 2, 3, 4, 5]]

只需摆脱封闭的方括号,使其正常工作。此外,正如您在Python 2中所做的那样,您不需要进行list转换,只需这样做:

range(6)

这是你的第二选择。 :)

答案 2 :(得分:0)

var1 = [list(range(6))]创建列表列表,而var2 = range(6)创建列表。

>>> var1 = [list(range(6))]
>>> var1
[[0, 1, 2, 3, 4, 5]]
>>> var2 = range(6)
>>> list(var2)
[0, 1, 2, 3, 4, 5]

当你在方括号内的python中包含一个变量时,它返回一个列表,其中包含的变量作为列表的元素:

>>> var3 = 1
>>> var4 = [var3]
>>> isinstance(var4, list)
True

所以你需要做list(range(6))。它返回一个列表。由于您通过[list(range(6))]将其包含在方括号中,因此您将其列为列表。