从全新的 Python 3.4 命令行启动中查看以下示例:
>>> len(globals())
6
>>> len(locals())
6
一开始就有 6 个全局变量,因为我们目前在全局范围内,所以也有 6 个局部变量:
>>> a = 1
>>> b = 2
>>> c = 3
>>> len(globals())
9
>>> len(locals())
9
现在我们添加了 3 个变量,现在这两个都是 9。
>>> def foo():
... a = 1
... b = 2
... print(len(locals()))
... print(len(globals()))
...
现在我们添加了函数foo(这是在全局范围内定义的,因此在全局范围内也由全局/本地计算):
>>> print(len(locals()))
10
>>> print(len(globals()))
10
最后,请注意,在函数内部,只有函数内部的变量是局部变量,而全局变量仍然包含全局范围内的所有内容:
>>> foo()
2
10
使用此逻辑,您可以使用len(locals()) 获取函数内定义的变量/函数的数量,并使用len(globals()) - 6 获取全局范围内定义的所有变量/函数的列表。
编辑 (注意以下都是新终端)
通过使用:
sum([not callable(globals()[i]) for i in globals()])
您可以获得当前在全局范围内的变量(不包括函数)的数量。通过将其分配给变量,您可以获得当前定义的变量列表:
>>> globs = sum([not callable(globals()[i]) for i in globals()])
>>> sum([not callable(globals()[i]) for i in globals()]) - globs - 1 # -1 for globs
0
现在:
>>> a = 1
>>> b = 2
>>> c = 3
>>> sum([not callable(globals()[i]) for i in globals()]) - globs - 1
3
>>> def foo():
... a = 1
... b = 1
... print(len(locals()))
...
>>> foo()
2
>>> sum([not callable(globals()[i]) for i in globals()]) - globs - 1
3
因此,通过在代码顶部添加 globs = sum([not callable(globals()[i]) for i in globals()]),然后每次调用 sum([not callable(globals()[i]) for i in globals()]) - globs - 1 将在该点给出定义数量的变量(这是在全局范围内,您可以使用类似的方法locs = sum([not callable(locals()[i]) for i in locals()]) 在函数内部做同样的事情)。
编辑 2
我不确定是否有按照您的要求进行操作的本地方式,但是您有两种选择:
- 解析脚本(这个很费功夫)
- 保留一个计数器,在每次函数调用结束时递增:
>>> num_encountered_locals = 0
>>> def foo():
global num_encountered_locals
a = 1
b = 2
num_encountered_locals += len(locals())
>>> num_encountered_locals
0
>>> foo()
>>> num_encountered_locals
2
>>> foo()
>>> foo()
>>> foo()
>>> num_encountered_locals
8
(由于某种原因,最后一批代码格式不正确,所以我不得不手动将其放入 <code> 和 <pre> 标签中)