Nic*_*Nic 0 python recursion function global-variables
我来自具有丰富Java和PHP经验的国家,因此当涉及Python时,许多规则对我来说都不有意义。
我下面有一个递归的斐波那契函数,它吐出错误:
Traceback (most recent call last):
File "C:\Users\Nic\workspace\lab8\src\Main.py", line 26, in <module>
print fibcount(27),"took",calls,"calls."
File "C:\Users\Nic\workspace\lab8\src\Main.py", line 19, in fibcount
calls += 1
UnboundLocalError: local variable 'calls' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
calls = 0
def fibcount(n):
calls += 1
if n < 2:
return (1,1)
f1,c1 = fibcount(n-1)
f2,c2 = fibcount(n-2)
return (f1+f2,c1+c2+1)
print fibcount(27),"took",calls,"calls."
Run Code Online (Sandbox Code Playgroud)
在Java中,这显然是可行的,因为相对于函数而言,调用是全局变量,fibcount()因此使我感到困惑的是,调用不在某种程度上。
我究竟做错了什么?
在Python中,您需要将全局变量声明为函数内部的全局变量,然后将它们重新分配为其他值。您将为此使用global:
def fibcount(n):
global calls
...
Run Code Online (Sandbox Code Playgroud)
否则,Python会将calls变量视为本地变量。
但是请注意,您只需要对重新分配的全局变量执行此操作。只需阅读它们的值即可。
同样,在Python中认为像这样重新分配全局变量很丑陋,应尽可能避免。大多数时候,您应该坚持将值传递给函数,然后将变量重新分配给它们的返回值。如果需要维护状态,请使用类。
在Python中唯一需要保证全局变量的时间是当您要具有模块级常量时。在这种情况下,约定是它们应使用全大写字母名称:
MYCONST = 12345
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4374 次 |
| 最近记录: |