Python根据 绑定行为 确定编译时变量的范围。如果您分配一个名称,或将其用作
import目标(以及其他几种方式),则将名称绑定在范围中。
您绑定到该函数
n_1并
n_2在其中
fib();两者都被分配给。这使这两个名称在中成为 本地
名称
fib(),Python甚至不会查看周围的范围。
您需要覆盖此行为,并且可以使用以下
nonlocal语句来做到这一点:
def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 return n else: n = n_1 + n_2 n_2 = n_1 n_1 = n return n return fib
nonlocal明确 告诉编译器您不希望它查看绑定行为,而是将名称视为闭包。
接下来,您将
n在
if测试的第一个分支中使用,但尚未在
else分支之外的任何地方定义它。
1无论如何,您应该只返回那里:
def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 return n_1 else: n = n_1 + n_2 n_2 = n_1 n_1 = n return n return fib
最后但并非最不重要的一点是,您可以使用元组分配交换两个变量,而无需任何中介:
def fibGen(): n_1 = 0 n_2 = 0 def fib(): nonlocal n_1, n_2 if n_1 ==0 and n_2 ==0: n_1 = 1 else: n_1, n_2 = n_1 + n_2, n_1 return n_1 return fib
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)