当我阅读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
答案 0 :(得分:3)
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)
range
构造了一个新列表。所以,例如:
range(4) == [0, 1, 2, 3]
Python中的 xrange
2.X是一个生成器,它懒惰地产生相当于range
返回的值而没有任何内存开销。
Python 3.X摆脱range
并将其替换为xrange
。 xrange
的行为通常更有效,但如果您确实需要使用范围构建列表,则必须显式迭代它或使用list
构造函数。
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,它确实对我有用。看起来他们为了效率而做出了改变。