作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个简单的 Python 程序。它应该返回一个返回连续斐波那契数的闭包:
def fibGen():
n_1 = 0
n_2 = 0
n = 1
def fib():
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
f = fibGen()
for i in range(0,10):
print(f())
我在运行时遇到这个错误:UnboundLocalError:赋值前引用了局部变量“n_1”
编辑:在我原来的帖子中,我没有在 fibGen
的定义中包含 n = 1
但它实际上是一个拼写错误。无论如何,我仍然会遇到同样的错误。
最佳答案
Python 根据绑定(bind)行为 在编译时确定变量的范围。如果您分配给一个名称,或将其用作 import
目标(以及其他一些方式),您就是在一个范围内绑定(bind)该名称。
您在 fib()
函数中绑定(bind)到 n_1
和 n_2
;两者都被分配给。这使得这两个名称在 fib()
中成为 local,Python 甚至不会查看周围的范围。
您需要覆盖此行为,您可以使用 nonlocal
statement 来完成此操作:
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
告诉编译器明确您不希望它查看绑定(bind)行为,而是将名称视为闭包。
接下来,您在 if
测试的第一个分支中使用了 n
,但是您没有在 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
关于python - 打印斐波那契数列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26803203/
我是一名优秀的程序员,十分优秀!