以下代码在此邮件的标题上生成错误。
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())))
我不知道为什么第一个代码会产生错误。 请告诉我第一个代码产生错误的原因。
答案 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循环使用。