Python迭代器内存错误

Python迭代器内存错误,python,Python,我运行这个程序是为了创建迭代器,但在它开始打印任何内容之前,我就遇到了内存错误 def test(): for x in range(10000000000000): yield x for x in test(): print 'hi' 输出: tutorial@p1980:~/tej$ python itertest.py Traceback (most recent call last): File "itertest

我运行这个程序是为了创建迭代器,但在它开始打印任何内容之前,我就遇到了内存错误

def test():
        for x in range(10000000000000):
                yield x

for x in test():
        print 'hi'
输出:

tutorial@p1980:~/tej$ python itertest.py
Traceback (most recent call last):
  File "itertest.py", line 7, in <module>
    for x in test():
  File "itertest.py", line 4, in test
    for x in range(10000000000000):
MemoryError
tutorial@p1980:~/tej$python itertest.py
回溯(最近一次呼叫最后一次):
文件“itertest.py”,第7行,在
对于测试()中的x:
测试中第4行的文件“itertest.py”
对于范围内的x(100000000000):
记忆者

您似乎正在使用Python 2。在这种情况下,请使用
xrange()
而不是
range()
xrange()
函数返回一个像迭代器而不是列表一样工作的对象


在Python 3中,
range()
返回一个像迭代器一样工作的对象,并且不提供
xrange()
函数。

您的问题是什么<代码>范围(100000000000)创建了一个相当大的列表。如果我只运行
x=range(100000000000)
,进程在死亡前会使用高达56GB的内存。@Shashank:区别在于语义。Python2实际上返回一个“xrange对象”,出于上述目的,它在功能上与迭代器相同。无论如何,我已经编辑了答案。在Python3中,有一些非常有用的优化。除此之外,Python3允许您仅使用
print(*test(),sep='\n')
打印生成器。不过,最好说它返回一个iterable对象。即使您知道它并不完全返回迭代器,也最好避免将其他人与该术语混淆。Python甚至有一个特定的错误:
next(xrange(10))
(或Python 3.x中的range)产生:
TypeError:xrange对象不是迭代器
@shashashank:我已经更新了答案,以避免产生误导性的术语。我觉得进一步解释Python内部实现的细节会影响答案。如果需要进一步的细节,读者可以参考这些评论。