Skip to main content
 首页 » 编程设计

python之装饰器中不同类型的变量是否有不同的作用域 (Python)

2025年05月04日12kerrycode

我很难理解 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)”,后者的结果是“对象被要求...”。