Python 3,range().append() 报错:'range' 对象没有属性 'append

18 投票
2 回答
30691 浏览
提问于 2025-04-17 22:32

在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只是为了跟踪一个计数器,而这种用法并不需要一次性把整个列表都放在内存中。

根据文档的说明:

范围类型相比普通的列表或元组的好处在于,范围对象无论表示的范围大小如何,始终只占用同样(很小的)内存,因为它只存储起始值、结束值和步长值,必要时再计算单个项和子范围。

撰写回答