python - 列表推导式和一行 for 循环

标签 python list python-3.x memory generator

如果您执行此列表理解:

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/

相关文章:

python - 在 Python 中区分相等列表项的最佳方法

python-3.x - 如何在 sagemaker 中设置 NotebookApp.iopub_data_rate_limit

python请求cookies日期格式

c# - 比较列表的两个日期属性

java - 奇怪的断言等于并包含行为

python - 无法在 screen 上运行 .py 脚本

python - 如何在没有输出列的新文件上使用此机器学习模型?

python - 与平台无关的方式来获取图片文件夹?

python - 有没有办法避免对此进行线性搜索?

python - 如何在没有导入库的情况下获取python文件中的函数定义?