在python中调用生成器时出现未解决的参考错误

时间:2019-12-09 05:46:32

标签: python iterator generator

我正在用python编写生成器,此代码可以正常工作:

def gen(a, b):
    for i in itertools.count():
        if i % 2 == 0:
            yield a
        if i % 2 != 0:
            yield b


def main():
    x, y = 2, 1
    res = gen(x, y)  # gen = gen(x, y) would raise error
    print(list(next(res) for _ in range(10)))


if __name__ == '__main__':
    main()


>>
[2, 1, 2, 1, 2, 1, 2, 1, 2, 1]

如果我将res中的gen更改为main(),则会引发Unresolved reference error。但是,如果我删除main()并将gen = gen(x, y)放在if __name__ == '__main__':下,它就可以正常工作:

def gen(a, b):
    for i in itertools.count():
        if i % 2 == 0:
            yield a
        if i % 2 != 0:
            yield b


if __name__ == '__main__':
    gen = gen(2, 1)
    print(list(next(gen) for _ in range(10)))


>>
[2, 1, 2, 1, 2, 1, 2, 1, 2, 1]

我认为python中的generatoriterator的一种,因为它们可以在next()中使用,那为什么我们不能直接将gen(2, 1)传递到{{1 }}和next()一样?这引发了另一个错误: print(list(next(gen(2, 1)) for _ in range(10)))

1 个答案:

答案 0 :(得分:1)

如果您更改main函数并在行gen = gen(x, y)上出现错误,因为您正在重用变量名,将全局变量更改为局部变量,将会感到困惑。基本上,当您在函数内声明gen时,它会取消全局gen,因此现在gen()不存在。您可以通过不重用变量名来避免这种情况,或者如果您确实想重用该名称,则可以指定要导入全局变量gen,如下所示:

def main():
    global gen
    x, y = 2, 1
    gen = gen(x, y)
    print(list(next(gen) for _ in range(10)))

有关全局变量和局部变量的更多信息,请参见:https://www.geeksforgeeks.org/global-local-variables-python/