我想知道在range()
for loop
函数
for x in range(100):
print x
range在进入循环之前是否会初始化整个iter-able列表,还是足够聪明,可以在增量时生成值?
换句话说,如果我说。像这样的非常大的范围会有开销吗?
for x in range(1000**1000):
value = x
答案 0 :(得分:2)
这取决于Python版本:
range()
是一个类似于生成器的对象,可以按需生成值。range()
创建了一个物化列表。如果您想要类似生成器的对象,请使用xrange()
。答案 1 :(得分:2)
In Python 3, range产生一个"不可变序列"不是生成器或迭代器
In Python 2, range生成一个列表,Python 2也有xrange来创建一个"不透明序列的对象"它实际上没有内存开销,但是在Python 3中没有xrange
。
答案 2 :(得分:1)
如有任何疑问,很容易检查。在IDLE中(例如使用Python 3.3):
>>> r = range(10)
>>> print(r)
range(0, 10)
>>> print(list(r))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
答案 3 :(得分:1)
是的!如果使用range()
,python在进入循环之前初始化整个iter-able列表。但是有一种简单的方法可以使用xrange()
来克服这种开销,它会在增量时生成值。这可以验证为:
>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> xrange(10)
xrange(10)