我针对 LeetCode 上的第 509 题用 Python 编写了下面的程序,该程序要求用户编写一个程序来查找斐波那契数列中第 n 个数字的值:
class Solution(object):
def fib(self, n):
output = 0
if n == 0:
output = 0
elif n == 1:
output = 1
else:
output = fib(n-1) + fib(n-2)
return(output)
然后我遇到了这个错误:
NameError: global name 'fib' is not defined
output = fib(n-1) + fib(n-2)
Line 9 in fib (Solution.py)
ret = Solution().fib(param_1)
Line 30 in _driver (Solution.py)
_driver()
Line 40 in <module> (Solution.py)
然后我查看了发布的所有解决方案,我注意到所有利用线性递归的解决方案都有一个共同点:它们在调用初始体中的
self.
函数之前都使用 fib()
作为前缀。功能。因此,我将解决方案更改为:
class Solution(object):
def fib(self, n):
output = 0
if n == 0:
output = 0
elif n == 1:
output = 1
else:
output = self.fib(n-1) + self.fib(n-2)
return(output)
错误消失了,LeetCode 接受了我的提交。
奇怪的是,我在IDE中运行了没有
self.
的初始代码,并且没有运行时错误;该程序正在运行。
为什么我必须使用
.self
才能摆脱LeetCode上的运行时错误?
在Python中,关键字
self.
指的是调用该方法的类的实例。 当你想调用同一个类的方法时,你需要使用 self.
来引用要调用该方法的实例。
这就是第一个代码(错误代码)出现错误的原因
NameError: global name 'fib' is not defined
。 fib()
(没有 self.
)可以称为 全局(类外)函数,而你还没有定义它。
结论:当您需要
调用类函数时,请使用
self.
。