范围在2.x和3.x中是急切评估还是惰性评估?

0 投票
2 回答
4035 浏览
提问于 2025-04-18 06:55

我在研究 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))

撰写回答