在发电机功能中是否无法访问局部变量?

时间:2016-09-10 20:35:09

标签: python python-3.x generator

我正在学习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)

我的问题是:你能否像常规函数一样在生成器函数中使用局部变量?

2 个答案:

答案 0 :(得分:1)

在第一个代码中,您尝试将num用作全局变量:它在函数外部定义。

当程序到达num += 1时,您将尝试分配一个本地变量,该变量恰好与您之前引用的全局变量同名。但由于名为num的局部变量尚未被赋值,因此增量失败。

如果要在函数内分配或递增全局变量,则必须使用global num声明它(通常在函数的开头)。这与发电机无关,它也会因常规功能而失败。

答案 1 :(得分:1)

作为UnholySheep has commentednum变量未在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的生成器)无关。