python - 在 python 中调用生成器时引发 Unresolved 引用错误

标签 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]

如果我在 main() 中将 res 更改为 gen,则会引发未解析的引用错误。但是如果我删除 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中的generator是一种iterator,因为它们可以在next()中使用,那为什么我们不能直接将 gen(2, 1) 传递到 next() 作为 print(list(next(gen(2, 1)) for _ in range(10) ))?这会引发另一个错误: “生成器”对象不可调用

最佳答案

如果您更改 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/

关于python - 在 python 中调用生成器时引发 Unresolved 引用错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59243138/

相关文章:

python - 直到给定百分位数的变量累积和

Python sqlite3 字符串格式化

python - Django extras() - 逻辑/算法

c++ - C++ 迭代器段错误

Java:迭代器

javascript - 将参数传递给生成器函数

python - 如何加快第一列分割文件的代码

c++ - 为什么不是来自 std::array 双向/随机访问的 ConstexprIterator?

Python:懒惰地遍历类目录结构

python - `yield from` 生成器与 `yield from` 列表性能