Introduction
今天写代码需要生成一个整数构成的list,于是很自然地想到range函数。可以当我将生成的内容传入一个需要list参数的函数中,奇怪的事情发生了,竟然提示传入的不是一个list。于是上网寻求解决方法,并进行验证。原来在python3中range的实现变了,并不是返回一个list类型,而是返回一迭代对象。
print(type(range(1,4)))
# 输出:<class 'range'>
print(range(1,4))
# 输出:range(1, 4)
a = list(range(1,4))
print(type(a))
#输出:<class 'list'>
for i in range(1,4):
print(i)
#输出:1 2 3
Explain
可以看到range()函数返回的是一个range对象。不过可以使用list()函数将其转换成list对象。range是一个可迭代的对象,可以使用for循环迭代输出。
貌似这样的设计很反人类,但是设计者这样设计,一定是为了某些特殊的原因。这种设计其实为了节省内存,官网有英文的说明。下面是一位网友给出的翻译。
在很多种情况下,range()函数返回的对象的行为都很像一个列表,但是它确实不是一个列表,它只是在迭代的情况下返回指定索引的值,但是它并不会在内存中真正产生一个列表对象,这样也是为了节约内存空间。
我们称这种对象是可迭代的,或者是可迭代对象,还有一种对象叫迭代器,它们需要从一个可迭代对象中连续获取指定索引的值,一直到索引结束。list()函数就是这样一个迭代器,它可以把range()函数返回的对象变成一个列表。
Summary
range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表。
list() 函数是对象迭代器,把对象转为一个列表。返回的变量类型为列表。
参考文章:python3中的range函数