我正在用 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/