我在一个函数上测试预定义的dict属性,我得到了一个我没想到的结果。考虑以下代码:
>>> def func():
x = 7
a = 0
print(func.__dict__)
>>> func()
{}
毕竟,我确实在函数的命名空间中定义了两个变量。那么为什么这些名字没有出现在函数的dict属性中呢?
我在一个函数上测试预定义的dict属性,我得到了一个我没想到的结果。考虑以下代码:
>>> def func():
x = 7
a = 0
print(func.__dict__)
>>> func()
{}
毕竟,我确实在函数的命名空间中定义了两个变量。那么为什么这些名字没有出现在函数的dict属性中呢?
函数__dict__
拥有属性,而不是局部变量。局部变量特定于函数的每次执行,而不是函数本身,因此您无法通过检查函数来获取局部变量值。
如果您分配了一个属性:
func.blah = 3
那会出现在__dict__
.
(A__dict__
不包含所有属性 - 还有其他创建属性的方法,这就是为什么__dict__
它本身不会出现在 中__dict__
,例如。)
函数对象的__dict__
属性存储分配给函数对象的属性。
>>> def foo():
... a = 2
... return a
...
>>> foo.bar = 12
>>> foo.__dict__
{'bar': 12}
函数对象的属性与函数调用过程中存在的局部变量无关。前者是唯一的(__dict__
每个函数对象有一个),后者不是(一个函数可以使用单独的局部变量多次调用)。
>>> def nfoo(n: int):
... print(f'level {n} before:', locals())
... if n > 0:
... nfoo(n - 1)
... print(f'level {n} after: ', locals())
...
>>> nfoo(2)
level 2 before: {'n': 2}
level 1 before: {'n': 1}
level 0 before: {'n': 0}
level 0 after: {'n': 0}
level 1 after: {'n': 1}
level 2 after: {'n': 2}
请注意locals
每个级别的 是如何同时存在的,但对于相同的名称保存不同的值。
__dict__
是否支持函数属性,它不是名称空间,也不是函数体范围的符号表。您可以阅读PEP-232以获取有关函数属性的更多信息。