在 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]。
提前非常感谢, 先生。
在Python2中,
range
返回一个列表。
在Python3中,
range
返回一个范围对象。
range 对象没有append 方法。要修复此问题,请将范围对象转换为列表:
>>> myrange = list(range(10,100,10))
>>> myrange.append(200)
>>> myrange
[10, 20, 30, 40, 50, 60, 70, 80, 90, 200]
范围对象是一个迭代器。它有目的地避免形成所有值的列表,因为这需要更多内存,并且人们通常使用
range
只是为了跟踪计数器 - 这种用法不需要立即将完整列表保存在内存中。
来自文档:
范围类型相对于常规列表或元组的优点是 范围对象将始终占用相同(少量)的内存,不 不管它代表的范围的大小(因为它只存储 开始、停止和步骤值,计算单个项目和 根据需要划分子范围)。
检查 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
对象。
这里列出(c)需要很多时间。我们只需要:
>>> c = list()
这样更有效率!!!