私は現在Pythonシェルで計算をしています。私が欲しいのは、それまでに定義されたすべての変数を見ることができるMatlabスタイルのリストです(だから私はどの名前を使ったか、それらの値などを知っています)。
方法はありますか、そしてそれをどのようにして行うことができますか?
あなたが使うことができるいくつかのこと:
dir()
はスコープ内変数のリストをあなたに与えるでしょう:globals()
はあなたにグローバル変数の辞書を与えるでしょうlocals()
はあなたに局所変数の辞書を与えるでしょう可能であれば、 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インタプリタです。便利なマジックの1つにstore
があります。これにより、セッション間で変数を保存できます(pickle
を使用)。
数分あれば、Jeff Rushの優れた IPythonデモのスクリーンキャスト を調べてください。
注意:私はIPython Devとは関係がありません - 満足しているユーザーです。
RedBlueThingとアナログが言ったように:
dir()
はスコープ内変数のリストを提供しますglobals()
はグローバル変数の辞書を提供しますlocals()
はローカル変数の辞書を提供しますインタラクティブシェル(バージョン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__
のディクショナリ値を出力する過程で、組み込み関数、例外、上記のような簡単な<module '__builtin__' (built-in)>
ではなく、「'type': <type 'type'>
」などのタイプ。
dir()
の詳細については、New Mexico Techの Python 2.7クイックリファレンス またはibiblio.orgの dir()関数 を参照してください。
locals()
およびglobals()
の詳細については、Dive Into Pythonの- localsおよびglobals およびニューメキシコの globals に関するページを参照してください。技術.
[コメント:@Kurt: enumerate-or-list-all-variables-in-a-a-program-of-your-favorite-language-here へのリンクを与えましたが、その答えには間違いがありますそれ。問題は次のとおりです。その例のtype(name)
は常に<type 'str'>
を返します。質問に答える変数のリストを取得しますが、それらの横に誤ったタイプがリストされます。この例では、すべての変数が文字列であったため、明らかではありませんでした。ただし、返されるのは、変数の型ではなく、変数の名前の型です。これを修正するには:print type(name)
の代わりにprint eval('type(' + name + ')')
を使用します。回答セクションにコメントを投稿したことをおpoびしますが、コメントを投稿する権限がなく、他の質問は終了します。]
名前を取得するには
for name in vars().keys():
print(name)
値を取得するには
for value in vars().values():
print(value)
vars()はオプションの引数を取り、オブジェクト自体の中でどのvarsが定義されているかを調べます。
地元の人を印刷()
コメントから編集を続けた。
印刷時に見栄えをよくするには:
import sys, pprint
sys.displayhook = pprint.pprint
locals()
それはあなたにもっと垂直方向のプリントアウトを与えるでしょう。
dir()は現在のすべてのインポート、および変数を返します。
変数だけが必要な場合は、varScore、varNamesなど、dirから抽出しやすい命名規則をお勧めします。
そのように、あなたは単にこれをすることができます:
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"が表示されます(Tuple)。簡単な回避策は、Wordの「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__')]
globals()、locals()、vars()、およびdir()はすべてあなたが望むものを手助けするかもしれません。
私のPython 2.7インタプリタでは、MATLABに存在するのと同じwhos
コマンドがPythonに存在します。これは、MATLABのアナログ(変数名、型、および値/データ)と同じ詳細を示します。
Pythonインタプリタでは、whos
は "interactive名前空間"内のすべての変数をリストします。
def MyWho():
print [v for v in globals().keys() if not v.startswith('_')]
これは対話型シェルで定義する必要があります。
インポートos、a = 10、インポートsys、MyWho()
['a'、 'MyWho'、 'sys'、 'os']