我正在学习Python并在今天早些时候在python控制台中运行这段代码:
num = 0
def generator():
while True:
yield num
num += 1
for i in generator():
if i > 5: break
print(i)
它抛出UnboundLocalError: local variable 'num' referenced before assignment
我重新编写了代码,这个版本有效:
def generator():
num = 0
while True:
yield num
num += 1
for i in generator():
if i > 5: break
print(i)
我的问题是:你能否像常规函数一样在生成器函数中使用局部变量?
答案 0 :(得分:1)
在第一个代码中,您尝试将num用作全局变量:它在函数外部定义。
当程序到达num += 1
时,您将尝试分配一个本地变量,该变量恰好与您之前引用的全局变量同名。但由于名为num的局部变量尚未被赋值,因此增量失败。
如果要在函数内分配或递增全局变量,则必须使用global num
声明它(通常在函数的开头)。这与发电机无关,它也会因常规功能而失败。
答案 1 :(得分:1)
作为UnholySheep has commented,num
变量未在generator()
函数中本地定义。
使用generator()
关键字标记您在global
函数中的全局命名空间中使用它:
num = 0
def generator():
global num
while True:
yield num
num += 1
for i in generator():
if i > 5: break
print(i)
......一切都应该没问题。
注意:此问题与您正在使用的功能类型(包括yield
的生成器)无关。