当前位置:  开发笔记 > 编程语言 > 正文

查看所有定义的变量

如何解决《查看所有定义的变量》经验,为你挑选了7个好方法。

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

有办法吗,我该怎么做?



1> RedBlueThing..:

你可以使用的一些东西:

dir() 将为您提供范围变量列表:

globals() 会给你一个全局变量的字典

locals() 会给你一个局部变量的字典



2> Chris Lawlor..:

如果可能,您可能想要使用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无关 - 只是一个满意的用户.


+1,但希望我能投票+10:IPython的%谁从本地人()中删除非用户变量!
这个答案是半有用的,因为如果有人不熟悉IPython,他们就不会知道他们需要打开自动命令才能运行.默认情况下,他们需要使用%前缀魔术命令,例如`%who`

3> Linguist..:

正如RedBlueThing和模拟所说:

dir() 给出范围变量的列表

globals() 给出全局变量的字典

locals() 给出了局部变量的字典

使用交互式shell(版本2.6.9),创建变量后a = 1b = 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 + ')').我为在答案部分发表评论而道歉,但我没有评论发布权限,另一个问题已经关闭.



4> Brian R. Bon..:

获取名称:

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

获取值:

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

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



5> Harold..:

打印当地人()

编辑继续评论.

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

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

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



6> John T..:

请记住,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",因为它是一个变量(好吧,一个元组).一个快速的解决方法是将"进口"一词添加到导入元组本身!



7> jamk..:

更聪明(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__')]

推荐阅读
云聪京初瑞子_617
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有