0

我在一个函数上测试预定义的dict属性,我得到了一个我没想到的结果。考虑以下代码:

>>> def func():
       x = 7
       a = 0
       print(func.__dict__)

    
>>> func()
{}

毕竟,我确实在函数的命名空间中定义了两个变量。那么为什么这些名字没有出现在函数的dict属性中呢?

4

3 回答 3

2

函数__dict__拥有属性,而不是局部变量。局部变量特定于函数的每次执行,而不是函数本身,因此您无法通过检查函数来获取局部变量值。

如果您分配了一个属性:

func.blah = 3

那会出现在__dict__.

(A__dict__不包含所有属性 - 还有其他创建属性的方法,这就是为什么__dict__它本身不会出现在 中__dict__,例如。)

于 2020-08-20T08:27:14.777 回答
1

函数对象的__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每个级别的 是如何同时存在的,但对于相同的名称保存不同的值。

于 2020-08-20T08:28:31.353 回答
1

__dict__是否支持函数属性,它不是名称空间,也不是函数体范围的符号表。您可以阅读PEP-232以获取有关函数属性的更多信息。

于 2020-08-20T08:31:45.553 回答