嵌套生成器与生成器内嵌套列表推导式的功能是否完全一致?
两个嵌套生成器的功能差异
先看你给出的代码:
# list of variables variables = [] nestedGen = (x for x in (y for y in variables)) nestedList = (x for x in [y for y in variables])
这两个生成器功能不完全一致,核心差异在于惰性求值和立即求值的区别:
- 对于
nestedGen:内层是生成器表达式(y for y in variables),生成器是惰性的——只有当你迭代外层生成器时,内层才会逐个遍历variables的元素,而且每次迭代外层生成器时,都会重新读取当前variables的状态。 - 对于
nestedList:内层是列表推导式[y for y in variables],列表推导式是立即求值的——在你定义nestedList的那一刻,这个列表就已经生成并固定下来了,后续variables的修改不会影响这个列表的内容。
举个实际例子就能看明白:
variables = [] nestedGen = (x for x in (y for y in variables)) nestedList = (x for x in [y for y in variables]) # 后续修改variables variables.append(1) variables.append(2) print(list(nestedGen)) # 输出 [1, 2],迭代时才读取当前的variables print(list(nestedList)) # 输出 [],列表推导式在定义时已经生成了空列表
除此之外,两者的内存占用也有区别:nestedGen全程不会一次性生成所有元素,内存占用极低;而nestedList会先把内层列表的所有元素加载到内存里,如果variables包含大量元素,内存开销会大很多。
内容的提问来源于stack exchange,提问作者user15318873
相关产品推荐
相关产品推荐

