gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:43:53 24 4
gpt4 key购买 nike

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

关于python - 装饰器中不同类型的变量是否有不同的作用域? (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32684081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com