Эта ошибка не связана с генераторами.Это ошибка области видимости.
В объявлении генератора вы используете имя values
, хотя генератор не выполняется до после цикл завершен, где values
теперь последнийпункт в списке.Вот пример, который воспроизводит вашу ошибку.
for i in [1]:
g = (i for _ in range(3))
i = 'some new value'
print(next(g)) # 'some new value'
Другими словами values[0]
и values[1]
не были привязаны к генератору, и если значение за именем values
изменится, то генераторы тожевыводы.
Это означает, что вы хотите, чтобы затвор вокруг вашего генератора сохранял значения values[0]
и values[1]
.Вы можете сделать это, определив свой генератор как функцию.
import itertools
# Here is a function taht will return a generator
def gen(a, b):
for x in itertools.count():
yield a * b * x
d = {"a": [-1, 2], "b": [1, 2], "c": [20, 20]}
g, g2 = dict(), dict()
for letter, values in d.items():
g[letter] = gen(values[0], values[1])
g2[letter] = [values[0] * values[1] * x for x in range(3)]
for i in range(3):
for l, v in g.items():
print(next(v))
print(g2)
Фактически, встроенные генераторы редко используются по этой причине.Воспользуйтесь def-yield
способом создания генераторов.
Кроме того, не звоните __next__
, используйте вместо него встроенный next
.
Вывод
0
0
0
-2
2
400
-4
4
800
{'a': [0, -2, -4], 'b': [0, 2, 4], 'c': [0, 400, 800]}