当名称未定义和未绑定时,我们可以在运行时看到NameError
和。UnboundLocalError
但目前尚不清楚名称评估是如何在运行时发生的?我假设如下:
考虑代码片段的示例
def foo():
a=3
def bar():
return a
tmp=bar()
res=a+tmp
return res
当bar
函数被调用时,我们创建了新的执行框架。将此帧表示为bar_frame
。bar_frame.f_local
字典中不包含任何元素。但bar_frame.f_back.f_locals
包含 4 个名称-值对。所以
我的理解:我们有以下名称评估算法:
试图
name
在currentframe.f_locals
1.1 如果
currentframe.f_locals
对应一个全局命名空间并且没有找到合适的名字则抛出NameError
1.1 如果找到合适的名称并且有界则返回
currentframe.f_locals[name]
1.2 如果找到合适的名字并且是无限抛出
UnboundLocalName
错误。试图
name
在currentframe.f_back.f_locals
请检查我的理解。