我目前正在使用python shell进行计算。我想要的是Matlab样式列表输出,你可以看到所有已经定义到一个点的变量(所以我知道我使用了哪些名称,它们的值等等。)
有办法,我该怎么做?
答案 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 = 1
和b = 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']