首页 > 解决方案 > Python - 带有装饰器的记忆 - 字典与标量 - 理解非本地内存

问题描述

我尝试理解记忆,特别是关于非本地记忆的代码如下:

def mem_last(f):
    mem = 0
    def helper(x):
        print("mem = ", mem)
        mem = f(x + mem)
        return mem
    return helper

def mem_last1(f):
    mem = {"0": 0}
    def helper(x):
        print("mem = ", mem)
        mem["0"] = f(x + mem["0"])
        return mem["0"]
    return helper
    
def f(x):
    print("x = ", x)
    return x

f = mem_last(f) 
#f = mem_last1(f)

print(f(0))

当我使用 f = mem_last(f) 时,mem 是一个标量,出现错误:

py mem.py

Traceback (most recent call last):
  File "mem.py", line 15, in <module>
    print(f(0))
  File "mem.py", line 4, in helper
    print("mem = ", mem)
UnboundLocalError: local variable 'mem' referenced before assignment

如果我使用f = mem_last1(f), wheremem是一个 dict,则没有错误并且效果很好。

请解释为什么字典和标量变量之间存在差异。非常感谢。

PS:我在 Windows 10 上使用 3.7.7 64 位。我已阅读您提供的线程,并通过在 'print("mem = ", mem)' 之前添加一行 "nonlocal mem" 来修复它。

但是,我的问题是为什么当 mem 是dict 或 list时不需要添加行“nonlocal mem”,并且没有发生错误。那么为什么 python 对待标量不同于 dict 或 list 呢?

标签: pythondictionarymemorydifferencescalar

解决方案


推荐阅读