我正在进行python shell中的计算.我想要的是Matlab样式列表输出,你可以看到所有已经定义到一个点的变量(所以我知道我使用了哪些名称,它们的值等等).
有办法吗,我该怎么做?
你可以使用的一些东西:
dir()
将为您提供范围变量列表:
globals()
会给你一个全局变量的字典
locals()
会给你一个局部变量的字典
如果可能,您可能想要使用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
).
如果您有几分钟的话,请查看Jeff Rush的优秀IPython演示截屏视频.
注意:我与IPython Dev无关 - 只是一个满意的用户.
正如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__':, '__package__': None, '__name__': '__main__', '__doc__': None}
Running globals()
给出的答案与locals()
本例完全相同.
我没有进入任何模块,因此所有变量都可用作本地和全局变量. locals()
并globals()
列出变量的值以及名称; dir()
只列出名称.
如果我导入模块并运行locals()
或globals()
在模块内部,dir()
仍然只提供少量变量; 它增加__file__
了上面列出的变量.locals()
并globals()
列出相同的变量,但在打印出字典值的过程中__builtin__
,它列出了更多的变量:内置函数,异常和类型如" 'type':
",而不仅仅是
如上所示的简要.
有关更多信息,dir()
请参阅New Mexico Tech的Python 2.7快速参考或ibiblio.org 的dir()函数.
有关详细信息locals()
,globals()
请参阅Dive Into Python中的locals和globals以及有关New Mexico Tech的全局变量的页面.
[评论:@Kurt:你给了一个枚举或列表所有变量在你最喜欢的语言程序中的链接 -但这个答案有错误.问题在于: type(name)
在那个例子中总会返回
.您确实得到了一个变量列表,它们回答了问题,但旁边列出的类型不正确.这在你的例子中并不明显,因为无论如何所有的变量都是字符串; 然而,它返回的是变量名称的类型而不是变量的类型.解决这个问题:而不是print type(name)
使用print eval('type(' + name + ')')
.我为在答案部分发表评论而道歉,但我没有评论发布权限,另一个问题已经关闭.
获取名称:
for name in vars().keys(): print(name)
获取值:
for value in vars().values(): print(value)
vars()还使用可选参数来找出在对象本身中定义的哪些变量.
打印当地人()
编辑继续评论.
为了使它在打印时看起来更漂亮:
import sys, pprint sys.displayhook = pprint.pprint locals()
这应该会给你一个更垂直的打印输出.
请记住,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",因为它是一个变量(好吧,一个元组).一个快速的解决方法是将"进口"一词添加到导入元组本身!
更聪明(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__')]