Python 3,range()。append()返回错误:' range'对象没有属性'追加'

时间:2014-03-16 13:11:09

标签: python python-2.7 python-3.x append range

在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]。

非常感谢, MRJ。

2 个答案:

答案 0 :(得分:29)

在Python2中,range返回一个列表。

在Python3中,range会返回range object。 范围对象没有append方法。要修复,请将范围对象转换为列表:

>>> myrange = list(range(10,100,10))
>>> myrange.append(200)
>>> myrange
[10, 20, 30, 40, 50, 60, 70, 80, 90, 200]

range对象是一个迭代器。它有目的地避免形成所有值的列表,因为这需要更多的内存,并且人们通常只使用range来跟踪计数器 - 这种用法不需要​​立即将完整列表保存在内存中。 / p>

来自the docs

  

范围类型优于常规列表或元组的优点是a   范围对象将始终采用相同(小)的内存量,不   重要的是它所代表的范围的大小(因为它只存储   开始,停止和步骤值,计算单个项目和   根据需要进行子范围。)

答案 1 :(得分:9)

查看unutbu的回答,了解您无法追加到range()的原因。

但是,请使用range()保留itertools.chain() - s迭代方法,而不是将其强制转换为列表然后附加到列表中。它更快,更有效。

>>> from itertools import chain
>>> c = chain(range(10,100,10), [200])
>>> list(c)
>>> [10, 20, 30, 40, 50, 60, 70, 80, 90, 200]

注意: 此处list(c)也强制chain对象,仅用于表示。请改用chain循环中的for对象。