如果您执行此列表理解:
squares = [x**2 for x in range(100000)]
它会占用大量内存,因此您可以使用生成器执行相同的操作:
squares = (x**2 for x in range(100000))
现在假设我想使用单行 for 循环来打印所有这些方 block :
[print(square) for square in squares]
我的问题是:以这种方式打印是否会创建一个列表(它看起来像一个列表理解)?如果是这样,该列表是否存储在内存中? (如果是这样,那么在创建方 block
时使用生成器就没有意义,因为它们无论如何都会存储在另一个列表中。)还有一件事:如果您这样做:
[1, 2, 3, 4, 5, 6]
如果不将其分配给任何变量,这些值是否会存储在内存中?
最佳答案
如果不将其分配给名称,则列表不会存储在内存中,因为没有引用保存它(最初。内存将为它分配,但它是立即释放,因为 (C)Python 可以看到您没有使用它*)。
除此之外,打印:
[print(square) for square in squares]
效率极低;您使用列表理解只是为了打印的副作用,这是一个包含 print
函数调用的结果的列表(其返回值)已填充。
这意味着您最终会得到一个None
列表,它的创建只是为了被转储,没有多大用处。
您最好使用带有 for
循环的生成器,正如 @user312016 在他的回答中建议的那样。生成器将按需生成,并且不会创建额外的列表。
*在交互模式下,情况有所不同,因为您将名称 _
用作最近计算的表达式的名称。在那里,列表将存储在内存中,直到下一个表达式覆盖附加到 _
的值。
关于python - 列表推导式和一行 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40973081/