查看所有定义的变量

时间:2009-03-11 02:32:55

标签: python variables

我目前正在使用python shell进行计算。我想要的是Matlab样式列表输出,你可以看到所有已经定义到一个点的变量(所以我知道我使用了哪些名称,它们的值等等。)

有办法,我该怎么做?

10 个答案:

答案 0 :(得分:292)

你可以使用的一些东西:

  • dir()将为您提供范围内变量列表:
  • globals()将为您提供全局变量字典
  • locals()将为您提供本地变量字典

答案 1 :(得分:186)

如果可能,您可能需要使用IPython

要获取所有当前用户定义变量的列表,IPython会提供名为who魔术命令(除非automagic功能,否则魔法必须以模数字符为前缀已启用):

In [1]: foo = 'bar'
In [2]: %who
foo

您可以使用whos魔法获取更多详细信息:

In [3]: %whos
Variable   Type    Data/Info
----------------------------
foo        str     bar

还有很多其他魔法可供选择。 IPython基本上是类固醇的Python解释器。一个方便的魔术是store,它允许您在会话之间保存变量(使用pickle)。

如果你有几分钟,请查看杰夫拉什的优秀IPython demo screencasts

注意:我与IPython Dev无关 - 只是一个满意的用户。

答案 2 :(得分:44)

正如RedBlueThing和模拟所说:

  • dir()提供范围变量列表
  • globals()提供全局变量字典
  • locals()提供了一个本地变量字典

使用交互式shell(版本2.6.9),在创建变量a = 1b = 2之后,运行dir()会给出

['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b']

正在运行locals()

{'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}

在这种情况下,正在运行globals()会给出与locals()完全相同的答案。

我还没有进入任何模块,因此所有变量都可用作本地和全局变量。 locals()globals()列出变量的值以及名称; dir()仅列出名称。

如果我导入模块并在模块内运行locals()globals()dir()仍然只提供少量变量;它将__file__添加到上面列出的变量中。 locals()globals()也列出了相同的变量,但在打印__builtin__的字典值的过程中,它列出了更多的变量:内置函数,异常,以及&#34; 'type': <type 'type'>&#34;等类型,而不仅仅是上面显示的简短<module '__builtin__' (built-in)>

有关dir()的更多信息,请参阅新墨西哥理工学院的Python 2.7 quick reference或ibiblio.org的the dir() function

有关locals()globals()的更多信息,请参阅Dive Into Python中的locals and globals和新墨西哥理工学院的globals页面。

[评论:@Kurt:您提供了enumerate-or-list-all-variables-in-a-program-of-your-favorite-language-here的链接,但答案中有错误。问题是:该示例中的type(name)将始终返回<type 'str'>。您确实得到了一个变量列表,它们回答了问题,但旁边列出的类型不正确。这在你的例子中并不明显,因为无论如何所有的变量都是字符串;然而,它返回的是变量名称的类型而不是变量的类型。要解决此问题,请执行以下操作:而不是print type(name)使用print eval('type(' + name + ')')。我为在答案部分发表评论而道歉,但我没有评论发帖权限,另一个问题已经结束。]

答案 3 :(得分:33)

获取名称:

for name in vars().keys():
  print(name)

获取值:

for value in vars().values():
  print(value)

vars()还采用可选参数来找出在对象本身中定义了哪些变量。

答案 4 :(得分:14)

打印本地人()

继续评论。

打印时让它看起来更漂亮:

import sys, pprint
sys.displayhook = pprint.pprint
locals()

这应该会给你一个更垂直的打印输出。

答案 5 :(得分:10)

请记住,dir()将返回所有当前导入的 AND 变量。

如果你只想要你的变量,我会建议一个易于从dir中提取的命名方案,例如varScore,varNames等。

这样,您可以这样做:

for vars in dir():
 if vars.startswith("var"):
   print vars

修改

如果要列出所有变量,但排除导入的模块和变量,例如:

__builtins__

你可以使用类似的东西:

import os
import re

x = 11
imports = "os","re"

for vars in dir():
    if vars.startswith("__") == 0 and vars not in imports:
        print vars

正如您所看到的,它将显示变量“imports”,因为它是一个变量(好吧,一个元组)。一个快速的解决方法是将“进口”一词添加到导入元组本身!

答案 6 :(得分:6)

更聪明(python 3)的方式:

def printvars():

   tmp = globals().copy()
   [print(k,'  :  ',v,' type:' , type(v)) for k,v in tmp.items() if not k.startswith('_') and k!='tmp' and k!='In' and k!='Out' and not hasattr(v, '__call__')]

答案 7 :(得分:3)

globals(),locals(),vars()和dir()都可以为您提供所需的帮助。

答案 8 :(得分:3)

在我的Python 2.7解释器中,Python中存在的相同whos命令存在于Python中。它显示与MATLAB模拟(变量名称,类型和值/数据)相同的细节。

在Python解释器中,whos列出了“交互命名空间”中的所有变量。

答案 9 :(得分:1)

def MyWho():
     print [v for v in globals().keys() if not v.startswith('_')]

这必须在交互式shell中定义。

import os,a = 10,import sys,MyWho()然后给出

['a','MyWho','sys','os']