python - 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 呢?
解决方案
推荐阅读
- django - Django REST Serializer 使用错误的模型进行序列化
- python - python文件写入程序运行时如何更新桌面上的文件大小
- javascript - 使用 d3.js 更新表数据
- c# - C#捕获从不在进程中的函数返回的异常?
- r - 如何设置仅在输入 3 时才显示集合向量的函数?
- javascript - 如果 URI 没有改变,例如在单页应用程序上,如何检测用户是否在新页面上?
- angular - Angular Kendo UI 全局访问
- php - 内连接循环通过
- git - 如何 git rebase 从另一个分支直接到 master 分支?
- javascript - 受控数字比例映射