我在读e-satis对What does the "yield" keyword do in Python?的回答。他说:
这些iterables很方便,因为你可以随心所欲地阅读它们,但是你把所有的值都存储在内存中,当你有很多值时,这并不总是你想要的
我不太同意。不过,我不能就此发表评论。
接下来是一个问题:Python的iterables真的将所有值存储在内存中吗?
我以前也这么认为。但自从昨天看到Python的详细文档后,我改变了我的看法。

>>> import sys
>>> def gen():
...   n = 0
...   while n < 10:
...     yield n
...     n += 1
...
>>> a = [0,1,2,3,4,5,6,7,8,9]
>>> b = range(10)  # b is a range object, which is a iterable
>>> c = gen(10)    # c is a iterator, which is a iterable too
>>> sys.getsizeof(a)
144
>>> sys.getsizeof(b)
48
>>> sys.getsizeof(c)
72
>>> B = list(b)
>>> C = list(c)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> B
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> C
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sys.getsizeof(B)
200
>>> sys.getsizeof(C)
160

我们错误地认为iterable将所有值存储在内存中,因为我们在使用iterable时习惯于获取所有值。
我说得对吗?

最佳答案

你引用那个答案时删去了太多的上下文。它是专门在类似iterables的列表的上下文中创建的。生成器和yield关键字将在答案的后面单独介绍。
扩展报价:
你能用的一切。。。在…“上是一个可接受的;列表,
字符串,文件。。。
这些读物很方便,因为你读得和读得一样多
希望,但是你把所有的值都存储在内存中,这并不总是
当你有很多价值观的时候你想要什么。
对于列表和字符串,声明是正确的,它们存储在内存中。但是对于文件来说,这是不正确的,因为您可以在文件上迭代,而不将其全部存储在内存中。
python iterable可以或不可以将值存储在内存中。它一次一个地遍历这些值,在每个步骤中,它都可以从内存中提取值、从头创建值或从另一个源(如文件)读取值。
range()是一个很好的例子:在Python2.x中,它预先生成所有值并将它们存储在内存中;在Python3.x中,它根据需要生成这些值。两者都返回一个iterable对象。

关于python - Python的可迭代对象是否真的将所有值存储在内存中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36619152/

10-13 00:04