问题是变量cache
不在函数匹配的范围内。如果您只想像第二个示例中那样读取它,这不是问题,但是如果您正在分配它,python 会将其解释为局部变量。如果你使用的是 python 3,你可以使用nonlocal
关键字来解决这个问题——不幸的是,对于 python 2,没有简单的解决方法。
def f():
v = 0
def x():
return v #works because v is read from the outer scope
def y():
if v == 0: #fails because the variable v is assigned to below
v = 1
#for python3:
def z():
nonlocal v #tell python to search for v in the surrounding scope(s)
if v == 0:
v = 1 #works because you declared the variable as nonlocal
global
全局变量的问题有些相同 -每次分配给全局变量时都需要使用,而不是读取它。
背后原因的简短解释:python解释器将所有函数编译成一个特殊的类型对象function
。在此编译期间,它检查函数创建的所有局部变量(用于垃圾收集等)。这些变量名保存在函数对象中。由于“隐藏”外部范围变量(创建具有相同名称的变量)是完全合法的,因此任何分配给且未显式声明为global
(或nonlocal
在 python3 中)的变量都被假定为局部变量。
当函数执行时,解释器必须查找它遇到的每个变量引用。如果在编译过程中发现该变量是本地变量,则在函数 f_locals 字典中进行搜索。如果尚未分配,则会引发您遇到的异常。如果变量未在函数范围内分配,因此不是其局部变量的一部分,则会在周围的范围内查找它 - 如果在那里找不到,则会引发类似的异常。