范围在2.x和3.x中是急切评估还是惰性评估?
我在研究 range
这个函数的时候,网上查到的信息显示(编辑:在2.x版本中)它是立即计算的。
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
但是当我在本地的Python3.3解释器中运行下面的代码时,
a = range(10)
print(a)
我得到了一个输出。
range(0, 10)
这让我觉得像是一个懒惰计算的函数,怎么回事呢?
注意:在Python2.7中,它总是表现得像是立即计算的。
2 个回答
2
在PyPy的情况有点复杂,简单来说,它其实是两者都有。
具体来说,当一个python2程序调用 range()
时,返回的结果类型是 list
,但它的实现方式更像是 types.XRangeType
;直到你尝试去修改它,这时它才会变成一个“真正的”列表。
11
在Python 2和Python 3之间,行为发生了变化。在Python 2中,使用时会创建一个列表,所以它是立即计算的。而在Python 3中,它创建的是一个范围对象,这个对象里的每个值都是按需计算的,也就是说,只有在需要的时候才会被计算出来。
在Python 2中,xrange
提供了一个懒惰版的range
。而在Python 3中,如果你想把整个懒惰对象强制转换成一个真正的列表,可以使用list(range(10))
。