Python 3,range().append() 报错:'range' 对象没有属性 'append
在Python 2.7中,下面的代码可以正常运行:
myrange = range(10,100,10)
myrange.append(200)
print(my range)
输出结果是:[10, 20, 30, 40, 50, 60, 70, 80, 90, 200]
但是在Python 3.3.4中,运行同样的代码会出现错误:
'range'对象没有'append'这个属性
这个错误在Python 3.3.4中出现的原因是什么?解决方法又是什么呢?
我们想要的输出结果是:[10, 20, 30, 40, 50, 60, 70, 80, 90, 200]。
2 个回答
12
查看 unutbu 的回答,了解为什么你不能往 range()
里添加内容。
不过,建议你继续使用 range()
的迭代方式,改用 itertools.chain()
,而不是强行把它变成列表再添加内容。这样做更快,也更有效率。
from itertools import chain
c = chain(range(10,100,10), [200])
print(list(c))
# [10, 20, 30, 40, 50, 60, 70, 80, 90, 200]
注意:
这里的 list(c)
只是为了展示而强行转换了 chain
对象。建议在 for
循环中直接使用 chain
对象。
51
在Python2中,range
会返回一个列表。
而在Python3中,range
返回的是一个范围对象。这个范围对象没有添加元素的方法。如果你想要添加元素,可以把这个范围对象转换成列表:
>>> myrange = list(range(10,100,10))
>>> myrange.append(200)
>>> myrange
[10, 20, 30, 40, 50, 60, 70, 80, 90, 200]
范围对象是一种懒惰的序列。它故意不把所有的值都放在一个列表里,因为这样会占用更多的内存。很多时候,人们使用range
只是为了跟踪一个计数器,而这种用法并不需要一次性把整个列表都放在内存中。
根据文档的说明:
范围类型相比普通的列表或元组的好处在于,范围对象无论表示的范围大小如何,始终只占用同样(很小的)内存,因为它只存储起始值、结束值和步长值,必要时再计算单个项和子范围。