计算分配给 python 中的值的变量数
Count the number of variables assigned to a value in python
如何计算脚本中分配的变量数?
例如通过 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
脚本执行后,可以调用globals
和locals
。这些都是 return 一本字典。 https://docs.python.org/2/library/functions.html#globals
为了计数到第 80 行(例如),您需要在该行停止执行(可能添加一个断点),然后可能会调用这些方法。
从全新的 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
(这是在全局范围内定义的,因此在全局范围内时也由 globals/locals 计算):
>>> print(len(locals()))
10
>>> print(len(globals()))
10
最后,请注意,在函数内部,只有函数内部的变量是局部变量,而全局变量仍然包含全局范围内的所有内容:
>>> foo()
2
10
使用此逻辑,您可以使用 len(locals())
获取函数中定义的 variables/functions 的数量,并使用 len(globals()) - 6
获取函数中定义的所有 variables/functions 的列表全局范围。
编辑 (注意以下都是新终端)
通过使用:
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>
标签中)
如何计算脚本中分配的变量数?
例如通过 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
脚本执行后,可以调用globals
和locals
。这些都是 return 一本字典。 https://docs.python.org/2/library/functions.html#globals
为了计数到第 80 行(例如),您需要在该行停止执行(可能添加一个断点),然后可能会调用这些方法。
从全新的 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
(这是在全局范围内定义的,因此在全局范围内时也由 globals/locals 计算):
>>> print(len(locals()))
10
>>> print(len(globals()))
10
最后,请注意,在函数内部,只有函数内部的变量是局部变量,而全局变量仍然包含全局范围内的所有内容:
>>> foo()
2
10
使用此逻辑,您可以使用 len(locals())
获取函数中定义的 variables/functions 的数量,并使用 len(globals()) - 6
获取函数中定义的所有 variables/functions 的列表全局范围。
编辑 (注意以下都是新终端)
通过使用:
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>
标签中)