如何使迭代器在其内部保留一些价值?

How make iterator that keep some value inside itself?

第一个代码:

for i in range(2,4):
  q = i
  print(list(q+j for j in range(q)))

Returns: [2,3] [3,4,5]

但是第二个代码:

zzz=[]
for i in range(2,4):
  q = i
  zzz.append(q+j for j in range(q))

for i in zzz:
  print(list(i))

Returns: [3,4] [3,4,5]

为什么结果不同? 如何使迭代器将 q 值保留在内部(在第二个代码中)? 谢谢

zzz=[]
for i in range(2,4):
  q = i
  zzz.append([q+j for j in range(q)])

for i in zzz:
  print(list(i))

这将产生预期的结果。 注意 zzz.append([...]) 中的方括号。这将评估列表中的生成器表达式。 (...) 语法适用于延迟执行的生成器,它将使用 q 的最后一个值。阅读此处了解更多信息 https://code-maven.com/list-comprehension-vs-generator-expression

如果你想要生成器在你的列表zzz中,你可以定义一个returns这个生成器的函数,例如:

def get_generator(q):
    return (q+j for j in range(q))

zzz=[]
for i in range(2,4):
  zzz.append(get_generator(i))

for i in zzz:
  print(list(i))

打印:

[2, 3]
[3, 4, 5]