UnboundLocalError是由Python的全局范围变量的产生引起的

时间:2019-02-28 03:56:52

标签: python-3.x

以下代码在此邮件的标题上生成错误。

n=2
def func():
    while True:
        y=n**2
        n=y
        yield y

print(next(iter(func())))

UnboundLocalError: local variable 'n' referenced before assignment

但是,当我更改为以下代码时,该代码可以正常工作。

n=2
def func():
    while True:
        y=globals()['n']**2
        globals()['n']=y
        yield y

print(next(iter(func())))

我不知道为什么第一个代码会产生错误。 请告诉我第一个代码产生错误的原因。

1 个答案:

答案 0 :(得分:0)

欢迎您!您的问题在于变量n的范围。由于您声明的n超出了func()的范围,因此该方法不知道变量。如果您将原始块更改为如下:

注意 func(),如所写,是一个无限循环,屈服将导致无限生成器。为了防止这种情况,需要一些破损条件。

def func():
    n = 2
    while True:
    y=n**2
    n=y
    yield y

然后使用yield语句创建的生成器,如下所示:

for item in func():
    print(item, "\n")

然后您应该会看到预期的结果!

我提供的版本可以使用,因为现在变量n在方法func()的“范围内”,因此不需要是全局的。

如果n必须在func()之外,则将其作为参数。

n = 2
def func(n):
    while True:
        y = n**2
        n = y
        yield y

第三个解决方案,防止生成器中出现无限循环:

n = 2
def func(n):
    # Define y for break to work initially
    y = 0
    while y <=  10000: # Replace 10000 with your ceiling value
        y = n**2
        n = y
        yield y

然后使用前面提供的相同的for循环使用。