查看所有定义的变量
- 2025-01-17 09:22:00
- admin 原创
- 9
问题描述:
我目前正在用 python shell 进行计算。我想要的是 Matlab 样式的列表,您可以在其中看到到目前为止已定义的所有变量(这样我就知道我使用了哪些名称、它们的值等)。
有什么办法吗?我该怎么做?
解决方案 1:
您可以使用以下一些东西:
dir()
将为您提供范围内变量的列表globals()
将为您提供全局变量的词典locals()
将为您提供局部变量的字典
解决方案 2:
如果可能的话,您可能想要使用IPython。
为了获取所有当前用户定义变量的列表,IPython 提供了一个名为magic 命令(除非启用该功能,否则who
magics 必须以字符为前缀):%
`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 Dev 没有任何关系 - 只是一个满意的用户。
编辑:
您可以在IPython 文档中找到所有魔法命令。
本文还包含有关在 Jupyter Notebook 中使用魔法命令的有用部分
解决方案 3:
获取名称:
for name in vars().keys():
print(name)
获取值:
for value in vars().values():
print(value)
vars() 还采用可选参数来找出对象本身内定义的变量。
解决方案 4:
正如 RedBlueThing 和 analog 所说:
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'type': <type 'type'>
<module '__builtin__' (built-in)>`
有关详细信息,dir()
请参阅新墨西哥理工学院的Python 2.7 快速参考或 ibiblio.org 上的dir() 函数。
要了解更多信息locals()
,globals()
请参阅Dive Into Python 中的局部变量和全局变量以及新墨西哥理工学院的全局变量页面。
[评论:@Kurt:您在此处提供了一个枚举或列出您最喜欢的语言程序中的所有变量的链接,但该答案有错误。那里的问题是: type(name)
在该示例中将始终返回<type 'str'>
。您确实获得了变量列表,它回答了问题,但旁边列出了错误的类型。这在您的示例中并不明显,因为所有变量碰巧都是字符串;但是,它返回的是变量名称的类型,而不是变量的类型。要解决此问题:而不是print type(name)
使用print eval('type(' + name + ')')
。我很抱歉在答案部分发表评论,但我没有发表评论的权限,另一个问题已关闭。]
解决方案 5:
print locals()
编辑继续评论。
为了使打印时看起来更漂亮:
import sys, pprint
sys.displayhook = pprint.pprint
locals()
这将会给你一个更加垂直的打印输出。
解决方案 6:
globals()
、、、都希望能帮助您locals()
实现您的愿望。vars()
`dir()`
解决方案 7:
更聪明一点(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__')]
解决方案 8:
请记住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 元组本身中!
解决方案 9:
这必须在交互式 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']
解决方案 10:
在我的 Python 2.7 解释器中,whos
MATLAB 中存在的相同命令也存在于 Python 中。它显示与 MATLAB 模拟相同的详细信息(变量名称、类型和值/数据)。
注意,在 Python 解释器中,whos
列出了“交互式命名空间”中的所有变量。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)