2017-05-18 29 views
1

如何计算在脚本中分配的变量数量?计算分配给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 
+1

做'LEN(当地人())'和'LEN(全局()) '完成你在找什么? –

+0

我不这么认为。我刚刚尝试了一个简单的测试脚本:a = 1,b = 2,c = 3,我希望len(locals())= 0和len(globals())= 3,但是我得到了11和11. – Astrophe

回答

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()])因此提出的

>>> 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 # -1 for globs 
0 

现在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>标签这最后大量的代码将无法正常格式化)

+0

这几乎是我使用的测试脚本。 – Astrophe

+0

@Astrophe请参阅编辑 –

+0

我最初考虑的是从全局范围运行一个计数,该计数将查看前面的行,逐行查看函数并计算局部变量(仅在脚本的表面上,即没有陷入迭代或递归)到num_locals。我明白,num_locals可能不是这个名字。 – Astrophe