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

Posted

技术标签:

【中文标题】Python 3,range().append() 返回错误:\'range\' 对象没有属性\'append\'【英文标题】:Python 3, range().append() returns error: 'range' object has no attribute 'append'Python 3,range().append() 返回错误:'range' 对象没有属性'append' 【发布时间】:2014-04-21 15:37:03 【问题描述】:

在 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 中,同样的代码 sn-p 返回错误:'range' object has no attribute 'append'

请有人解释一下 Python 3.3.4 中出现此错误的原因,并在可能的情况下提供解决方案?

所需的输出:[10, 20, 30, 40, 50, 60, 70, 80, 90, 200]。

提前非常感谢, 先生。

【问题讨论】:

【参考方案1】:

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

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

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

范围对象是一个迭代器。它故意避免形成所有值的列表,因为这需要更多内存,并且人们通常使用range 只是为了跟踪计数器——这种用法不需要​​一次将完整列表保存在内存中。

来自the docs:

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

【讨论】:

一个非常清晰简单的解决方案!感谢您的帮助、时间和专业知识:) A range 对象不是迭代器,这很容易通过尝试 next(range(10)) 来验证【参考方案2】:

查看unutbu 的回答,了解为什么不能附加到range()

但是,通过使用itertools.chain() 来保持range()-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 对象并且仅用于表示。请改用for 循环中的chain 对象。

【讨论】:

感谢您提供替代方法。绝对有效,尽管第一个答案为我提供了更多的教育材料:) 当然,我只是想指出建议尽可能长时间地使用迭代器。

以上是关于Python 3,range().append() 返回错误:'range' 对象没有属性'append'的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Python 中扩展列表时出现类型错误

python基础-- 07 切片

python 小兵函数根据问题详解

知识点总结

有没有像python中设置的数组方法?

中继现代突变,RANGE_ADD / Append