首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >计算python中分配给值的变量数。

计算python中分配给值的变量数。
EN

Stack Overflow用户
提问于 2017-05-18 15:11:39
回答 2查看 2.7K关注 0票数 1

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

例如,line_no = 80有num_globals =y和num_locals = z。

编辑

我知道局部变量并不都属于一个大的集合局部变量范围,它们位于不同的局部变量范围内,但是是否有一个好的方法来浏览一个脚本并对我们看到的所有局部变量进行求和?

例如:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-18 15:34:48

查看新的Python3.4命令行引导中的以下示例:

代码语言:javascript
复制
>>> len(globals())
6
>>> len(locals())
6

现在有6个全局变量,因为我们目前在全局范围内,也有6个局部变量:

代码语言:javascript
复制
>>> a = 1
>>> b = 2
>>> c = 3
>>> len(globals())
9
>>> len(locals())
9

现在我们增加了3个变量,这两个变量现在都是9。

代码语言:javascript
复制
>>> def foo():
...     a = 1
...     b = 2
...     print(len(locals()))
...     print(len(globals()))
...

现在,我们添加了函数foo (这是在全局范围中定义的,在全局范围内也是由全局/局部变量计算的):

代码语言:javascript
复制
>>> print(len(locals()))
10
>>> print(len(globals()))
10

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

代码语言:javascript
复制
>>> foo()
2
10

使用此逻辑,您可以使用len(locals())获取函数中定义的变量/函数的数量,使用len(globals()) - 6获取全局范围中定义的所有变量/函数的列表。

编辑(请注意,以下所有内容都是一个新的终端)

通过使用:

代码语言:javascript
复制
sum([not callable(globals()[i]) for i in globals()])

您可以获得当前全局范围内的变量数(不包括函数)。通过将其赋值给一个变量,您就可以得到当前定义的变量列表:

代码语言:javascript
复制
>>> 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

现在:

代码语言:javascript
复制
>>> 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. 保存一个计数器,在每个函数调用结束时递增:
代码语言:javascript
复制
>>> 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>标记中)

票数 1
EN

Stack Overflow用户

发布于 2017-05-18 15:22:59

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44051597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档