我很难理解 python 装饰器中变量的范围。我在某处读到非局部变量存储为只读。但不知何故,字典似乎是个异常(exception)。
def outer(f):
def inner():
print val
return f()
val =1
return inner
def outer2(f):
def inner2():
val+=1
print val
return f()
val =1
return inner2
def outer3(f):
def inner3():
d[0]+=1
print d
return f()
d ={0:0}
return inner3
import doctest
class Test: """
>>> function = lambda : 'Function called'
>>> f1=outer(function)
>>> f1()
1
'Function called'
>>> f2=outer2(function)
>>> f2()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in inner2
UnboundLocalError: local variable 'val' referenced before assignment
>>> f3=outer3(function)
>>> f3()
{0: 1}
'Function called'
"""
print (doctest.testmod())
为什么val不在f2的范围内?
为什么字典没有和整数一样的问题?
提前致谢!
请您参考如下方法:
原因是像+=这样的操作的性质是由左边的目标类型决定的,所以var += 1不是与 var[blah] += 1 相同。如果左侧是裸名,则这是一个变量重新绑定(bind)。如果不是,那就不是。在 d[0] += 1 的情况下,+= 由字典对象处理,不涉及重新绑定(bind)名称 d .
相关文档是here .请注意第一个要点和所有其他要点之间的区别,前者的结果只是“名称已绑定(bind)”,后者的结果是“对象被要求...”。
