【问题标题】:Dictionary as a global variable inside a function scope字典作为函数范围内的全局变量
【发布时间】:2020-10-02 20:42:38
【问题描述】:

我正在使用递归函数,例如:

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】:

    您没有在函数中更新 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}
    

    【讨论】:

    • 你是对的!但我仍然不明白全局声明的想法。如果我删除该行,它仍然会打印您的结果,为什么?
    • 这是因为你可以从函数内部的全局范围访问变量,并且字典是可变的,所以虽然没有global你不能改变init的字典references i> 在函数内部,你仍然可以更改它的内容。 有一个很好的讨论here
    猜你喜欢
    • 1970-01-01
    • 2013-07-13
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2017-03-05
    • 2023-03-19
    相关资源
    最近更新 更多