下面的陈述与获得范围的区别是什么?

时间:2014-08-05 03:16:09

标签: python django python-3.x

当我阅读Django门票并提取请求时,我发现他们有以下更改:

他们希望获得有关页码的范围,并从

更改
return range(1, self.num_pages + 1) # 1

为:

return six.moves.range(1, self.num_pages + 1) # 2

然后:

 return list(six.moves.range(1, self.num_pages + 1)) # 3

我很困惑1和3之间有什么区别?为什么不是这个,与3有什么不同?

 return list(range(1, self.num_pages + 1)) # 4

3 个答案:

答案 0 :(得分:3)

来自Python documentation

  

Python 3重新组织了标准库并移动了几个函数   到不同的模块。 Six为它们提供了一致的界面   通过假的six.moves模块。

在同一页面中,它告诉我们six.moves.range()为Python 2调用xrange(),为Python 3调用range()xrange()range()非常相似,除了它返回xrange个对象而不是list。因此,list()围绕调用将其变为list

似乎改变的重点是使代码适用于Python 2和Python 3。

答案 1 :(得分:1)

Python 2.X中的

range构造了一个新列表。所以,例如:

range(4) == [0, 1, 2, 3]
Python中的

xrange 2.X是一个生成器,它懒惰地产生相当于range返回的值而没有任何内存开销。

Python 3.X摆脱range并将其替换为xrangexrange的行为通常更有效,但如果您确实需要使用范围构建列表,则必须显式迭代它或使用list构造函数。

Python 2.X中的

range返回一个列表。在Python 3.X中:

>>> type(range(4))
<class 'range'>

要在Python 3中显式创建带范围的列表,请执行以下操作:

list(range(4)) == [0, 1, 2, 3]

或者

my_list = [ x for x in range(4) ]

答案 2 :(得分:0)

似乎这个SO问题可以提供一些指导:six.moves.builtins.range is not consistent in Python 2 and Python 3,它确实对我有用。看起来他们为了效率而做出了改变。