字典作为函数范围内的全局变量

问题描述 投票:0回答:1

我正在使用类似的递归函数:

from functools import lru_cache
init = {0:1,1:1}

@lru_cache(maxsize=10000)
def fib(n):
  global init
  if n in init.keys():
    return init[n]
  else:
    return fib(n-1)+fib(n-2)

并且我将init定义为全局变量,以便保存所有中间步骤以供将来进行任何计算,但是如果运行,则:

print(fib(20))
print(init)

它打印:

10946
{0: 1, 1: 1}

为什么即使我将init定义为全局变量,它仍然会打印相同的字典?我敢打赌这是由于return语句引起的,但我可能会感到厌倦。

python-3.x dictionary global-variables
1个回答
0
投票

您没有在函数中更新init的值,因此它永远不会更改为原始值。计算当前斐波那契数时,需要更新它:

from functools import lru_cache
init = {0:1,1:1}

@lru_cache(maxsize=10000)
def fib(n):
  global init
  if n in init.keys():
    return init[n]
  else:
    fibn = fib(n-1)+fib(n-2)
    init[n] = fibn
    return fibn

print(fib(20))
print(init)

输出:

10946
{0: 1, 1: 1, 2: 2, 3: 3, 4: 5, 5: 8, 6: 13, 7: 21, 8: 34, 9: 55, 10: 89, 11: 144, 12: 233, 13: 377, 14: 610, 15: 987, 16: 1597, 17: 2584, 18: 4181, 19: 6765, 20: 10946}
© www.soinside.com 2019 - 2024. All rights reserved.