查看所有定义的变量

Roo*_*ook 263 python variables

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

有办法吗,我该怎么做?

Red*_*ing 330

你可以使用的一些东西:

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

  • [详细描述这些的有用链接...](/sf/ask/557896461/。) (3认同)

Chr*_*lor 202

如果可能,您可能想要使用IPython.

要获取所有当前用户定义变量的列表,IPython会提供一个名为魔术的命令who(除非automagic启用该功能,否则magics必须以模数字符为前缀):

In [1]: foo = 'bar'
In [2]: %who
foo
Run Code Online (Sandbox Code Playgroud)

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

In [3]: %whos
Variable   Type    Data/Info
----------------------------
foo        str     bar
Run Code Online (Sandbox Code Playgroud)

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

如果您有几分钟的话,请查看Jeff Rush的优秀IPython演示截屏视频.

注意:我与IPython Dev无关 - 只是一个满意的用户.

  • +1,但希望我能投票+10:IPython的%谁从本地人()中删除非用户变量! (17认同)
  • 这个答案是半有用的,因为如果有人不熟悉IPython,他们就不会知道他们需要打开自动命令才能运行.默认情况下,他们需要使用%前缀魔术命令,例如`%who` (8认同)
  • 我编辑了答案,提到 `who` 只显示用户定义的变量,并解决了 `automagic` 问题。 (2认同)

Lin*_*ist 44

正如RedBlueThing和模拟所说:

  • dir() 给出范围变量的列表
  • globals() 给出全局变量的字典
  • locals() 给出了局部变量的字典

使用交互式shell(版本2.6.9),创建变量后a = 1b = 2,运行dir()

['__builtins__', '__doc__', '__name__', '__package__', 'a', 'b']
Run Code Online (Sandbox Code Playgroud)

跑步locals()

{'a': 1, 'b': 2, '__builtins__': <module '__builtin__' (built-in)>, '__package__': None, '__name__': '__main__', '__doc__': None}
Run Code Online (Sandbox Code Playgroud)

Running globals()给出的答案与locals()本例完全相同.

我没有进入任何模块,因此所有变量都可用作本地和全局变量. locals()globals()列出变量的值以及名称; dir()只列出名称.

如果我导入模块并运行locals()globals()在模块内部,dir()仍然只提供少量变量; 它增加__file__了上面列出的变量.locals()globals()列出相同的变量,但在打印出字典值的过程中__builtin__,它列出了更多的变量:内置函数,异常和类型如" 'type': <type 'type'>",而不仅仅是<module '__builtin__' (built-in)>如上所示的简要.

有关更多信息,dir()请参阅New Mexico Tech的Python 2.7快速参考或ibiblio.org 的dir()函数.

有关详细信息locals(),globals()请参阅Dive Into Python中的locals和globals以及有关New Mexico Tech的全局变量的页面.

[评论:@Kurt:你给了一个枚举或列表所有变量在你最喜欢的语言程序中的链接 -但这个答案有错误.问题在于: type(name)在那个例子中总会返回<type 'str'>.您确实得到了一个变量列表,它们回答了问题,但旁边列出的类型不正确.这在你的例子中并不明显,因为无论如何所有的变量都是字符串; 然而,它返回的是变量名称的类型而不是变量的类型.解决这个问题:而不是print type(name)使用print eval('type(' + name + ')').我为在答案部分发表评论而道歉,但我没有评论发布权限,另一个问题已经关闭.


Bri*_*ndy 35

获取名称:

for name in vars().keys():
  print(name)
Run Code Online (Sandbox Code Playgroud)

获取值:

for value in vars().values():
  print(value)
Run Code Online (Sandbox Code Playgroud)

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

  • python 在循环内生成新的变量,并且无法执行表达式,原因是:“运行时错误:字典在迭代期间更改了大小”。我必须将 vars() 存储在临时变量中,然后将它们打印出来 (2认同)

Har*_*old 14

打印当地人()

编辑继续评论.

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

import sys, pprint
sys.displayhook = pprint.pprint
locals()
Run Code Online (Sandbox Code Playgroud)

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

  • +1 为 sys.displayhook。非常感谢! (2认同)

Dev*_*rre 13

globals(), locals(), vars(), 和都dir()可以帮助您实现您想要的。


Joh*_*n T 10

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

如果你只是想要你的变量,我会建议一个易于从dir中提取的命名方案,例如varScore,varNames等.

这样,你可以简单地这样做:

for vars in dir():
 if vars.startswith("var"):
   print vars
Run Code Online (Sandbox Code Playgroud)

编辑

如果要列出所有变量,但排除导入的模块和变量,例如:

__builtins__
Run Code Online (Sandbox Code Playgroud)

你可以使用这样的东西:

import os
import re

x = 11
imports = "os","re"

for vars in dir():
    if vars.startswith("__") == 0 and vars not in imports:
        print vars
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它会显示变量"imports",因为它是一个变量(好吧,一个元组).一个快速的解决方法是将"进口"一词添加到导入元组本身!

  • 嗯,不,这恐怕是不可能的。他们中的大多数只是 t, a, c, d, L, p ... 等等。 (2认同)
  • 啊,我猜是一个小项目?使用单个字符变量制作大型项目时,我会发疯,一旦达到 1k+ LOC 并且您必须记住每个变量包含的内容......它变得令人沮丧。 (2认同)

jam*_*amk 10

更聪明(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__')]
Run Code Online (Sandbox Code Playgroud)


小智 8

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

def MyWho():
    print [v for v in globals().keys() if not v.startswith('_')]
Run Code Online (Sandbox Code Playgroud)

那么下面的代码就可以作为例子:

>>> import os
>>> import sys
>>> a = 10 
>>> MyWho()
['a', 'MyWho', 'sys', 'os']
Run Code Online (Sandbox Code Playgroud)


Bab*_*bak 5

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

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