【问题标题】:Count the number of variables assigned to a value in python计算分配给python中值的变量数
【发布时间】:2017-05-18 15:11:39
【问题描述】:

如何计算脚本中分配的变量数?

例如通过 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

【问题讨论】:

  • len(locals())len(globals()) 是否实现了您的目标?
  • 我不这么认为。我刚刚尝试了一个简单的测试脚本:a=1、b=2、c=3,我本来期望 len(locals()) = 0 和 len(globals()) = 3 但我得到了 11 和 11。

标签: python variables global-variables local-variables


【解决方案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

最后,请注意,在函数内部,只有函数内部的变量是局部变量,而全局变量仍然包含全局范围内的所有内容:

>>> 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

我不确定是否有按照您的要求进行操作的本地方式,但是您有两种选择:

  1. 解析脚本(这个很费功夫)
  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> 标签中)

【讨论】:

  • 这几乎是我使用的测试脚本。
  • 我最初考虑从全局范围运行计数,该计数将查看前几行,逐行遍历函数并计算局部变量(仅在脚本的表面即没有陷入迭代或递归)到num_locals。我很感激 num_locals 可能不是这个的正确名称。
  • @Astrophe 我不确定我是否理解,您能否通过示例测试用例和预期结果更新问题
  • 我已经编辑了这个问题。我很欣赏这是不寻常的。
  • @Astrophe 这个呢?
【解决方案2】:

脚本执行后,可以调用globalslocals。这些都返回一个字典。 https://docs.python.org/2/library/functions.html#globals

为了计数到第 80 行(例如),您需要在该行停止执行(可能添加断点),然后可能调用这些方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 2020-01-18
    • 2021-02-08
    • 2013-04-25
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多