python - 递归中使用的函数属性 - 是否存在全局函数属性?

标签 python

我有一个函数:

def fib(n, fib_d = {}):
     
   if n < 2:
      return 1
    
   if n not in fib_d:
     fib_d[n] = fib(n-2) + fib(n-1)
    
 
   return fib_d[n]

fib(1000)
# a big number returned in an instance

然后我尝试创建 fib_d 作为我可以访问的数据的函数的属性:

def fib(n):
   fib.fib_d = {}
   
   if n < 2:
      return 1
    
   if n not in fib.fib_d:
     fib.fib_d[n] = fib(n-2) + fib(n-1)
    
 
   return fib.fib_d[n]
fib(10)
# returns 89 in an instance
fib(100)
# runs till I stop it

所以我猜测 fib_d 每次都被创建为一个空参数,因此计算速度很慢

我想知道我是否可以拥有一个 global 函数属性,以便我可以访问它的内容,例如:

fib.fib_d
# {2: 2, 3: 3, 4: 5, 5: 8, 6: 13, 7: 21, 8: 34, 9: 55, 10: 89, ..., n: m}

我试过:

def fib(n, fib.fib_d):
   ...

但这是无效的,我知道函数属性可能应该只绑定(bind)到该函数,但我很好奇是否存在全局函数属性或至少可以在递归中使用的属性。

最佳答案

我只会使用缓存或 lru_cache。

但是要按照您的要求进行操作,最简单的方法是在闭包中定义您的函数:

def make_fib():

   def fib(n):
   
       if n < 2:
          return 1
    
       if n not in fib.fib_d:
         fib.fib_d[n] = fib(n-2) + fib(n-1)
       return fib.fib_d[n]
   fib.fib_d = {}
   return fib

f= make_fib()
f(2000)

这样,我们就有了一个正确作用域的函数属性。

关于python - 递归中使用的函数属性 - 是否存在全局函数属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70742944/

相关文章:

python - 使用 f2py 公开 "in,out"和 "inplace"版本的子例程

python - 在 Sqlite SELECT 语句中使用参数

python - 训练神经网络后,我为每个输入数据获得相同的输出(2000 个输入,1 个输出)

python - 使用 Flask 进行 pytest 无法找到模块

python - Python3中的打印功能

python - 如何替换 Python 列表中子序列的所有实例?

python - 运行能够与主程序通信但与系统隔离的不受信任的 python 代码

python - window : Z3Exception ("init(Z3_LIBRARY_PATH) must be invoked before using Z3-python")

python - Scipy ODR python

python - 列出对象的属性