查看所有已定义变量

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

有办法吗,我该怎么做?

550212 次浏览

要得到这些名字:

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

要得到这些值:

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

Vars()还接受一个可选参数,以确定对象本身中定义了哪些Vars。

打印当地人()

编辑继续评论。

为了在打印时看起来更漂亮:

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

这样打印出来的效果会更垂直。

你可以用一些东西:

  • dir()将给你范围内变量的列表:
  • globals()将给你一个全局变量的字典
  • locals()将给你一个局部变量的字典

globals()locals()vars(),和dir()都可以帮到你想要的。

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

如果你只是想要你的变量,我会建议一个容易从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”,因为它是一个变量(嗯,一个元组)。一个快速的解决方法是将单词“imports”添加到imports元组本身!

如果可能,你可能想要使用IPython

为了获得当前所有用户定义变量的列表,IPython提供了一个名为who神奇的命令(除非启用了automagic特性,否则magics必须以%字符作为前缀):

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

你可以使用whos魔法来获取更多细节:

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

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

注意:我没有与IPython开发-只是一个满意的用户。

编辑:

你可以在IPython文档中找到所有神奇的命令。

这篇文章在Jupyter Notebook中也有一个关于使用魔法命令的有用部分

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

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

以下面的代码为例:

>>> import os
>>> import sys
>>> a = 10
>>> MyWho()
['a', 'MyWho', 'sys', 'os']

更聪明一点的方法(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__')]

或者如果你想输出一个对象的变量:

def printObj(Obj, OutputMax=100):


tmp = Obj.__dict__
[print(k,'  :  ',str(v)[:OutputMax],' 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__')]

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

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

正如RedBlueThing和analog所说:

  • 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__的字典值的过程中,它列出了更多的变量:内置函数、异常和“'type': <type 'type'>”等类型,而不仅仅是上面所示的简短的<module '__builtin__' (built-in)>

有关dir()的更多信息,请参阅新墨西哥理工学院的Python 2.7快速参考或ibiblio.org的dir()函数

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

[评论:@Kurt:你给了一个enumerate-or-list-all-variables-in-a-program-of-your-favorite-language-here的链接,但这个答案有一个错误。问题是:这个例子中的type(name)总是返回<type 'str'>。您确实得到了一个变量列表,它回答了问题,但在它们旁边列出了不正确的类型。这在你的例子中并不明显,因为所有的变量都是字符串;但是,它返回的是变量名的类型而不是变量的类型。要修复此问题:使用print eval('type(' + name + ')')而不是print type(name)。我很抱歉在回答部分发表评论,但我没有发表评论的权限,另外一个问题已经结束了。