如何计算脚本中分配的变量数?
e.g。 by line_no = 80有num_globals = y和num_locals = z。
修改
我理解局部变量并不都属于一个大的集体局部变量范围,并且它们位于不同的局部范围内,但是有一种很好的方法来浏览脚本并总结我们看到的所有局部变量吗?
例如:
def foo():
#Two local variables
a=1
b=2
def bar():
#Two more local variables
a=10
for i in range(a):
a+=1
b=sum(i for i in range(10))
num_encountered_locals = 4
答案 0 :(得分:1)
执行脚本后,您可以拨打globals
和locals
。这些都返回字典。 https://docs.python.org/2/library/functions.html#globals
为了计算到第80行(例如),你需要在该行停止执行(可能添加一个断点),然后调用这些方法。
答案 1 :(得分:1)
从新的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
最后,请注意,在函数中,只有函数中的变量在本地,而globals仍然包含全局范围内的所有内容:
>>> 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>
标记中