Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのdir()・globals()・locals()関数の違いを徹底解説!vars()との使い分けも紹介

Pythonには、スコープ内の変数やオブジェクトの属性を確認するための組み込み関数として、locals()globals()vars()dir()などが用意されています。それぞれ似たような役割を持っていますが、返す内容や使い方に明確な違いがあります。この記事では、これらの関数の違いを具体例とともにわかりやすく解説します。

locals()とglobals()の違い

locals()は、ローカルスコープ(ローカル名前空間)で宣言された変数を辞書(dict)形式で返します。一方、globals()は、グローバルスコープで宣言された変数を辞書形式で返します。

なお、グローバルスコープ(モジュールのトップレベル)で呼び出した場合、locals()globals()はどちらも同じグローバル名前空間の辞書を返します。つまり、両者の違いを実感するには、関数の中から呼び出す必要があります。

実行例:関数内でlocals()とglobals()を呼び出す

def fun():
    var = 123
    print("Locals: ", locals())
    print("Vars: ", vars())
    print("Globals: ", globals())

fun()

このコードを実行すると、次のような出力が得られます。

Locals: {'var': 123}
Globals: {'__builtins__': <module 'builtins' (built-in)>, '__name__': '__main__',
          'fun': <function fun at 0x00000000037E3DD8>, '__doc__': None,
          '__package__': None}

locals()は関数内で定義されたvar = 123だけを含む辞書を返すのに対し、globals()はモジュール全体のグローバル名前空間(__name__fun自体など)を返していることがわかります。

vars()の特徴:引数を取れるのがポイント

vars()は、引数なしで呼び出した場合は現在の名前空間の辞書を返し、これはlocals()と同じ動作になります。

しかし、vars()locals()の最大の違いは、vars()は引数を受け取れるという点です。オブジェクトを渡すと、そのオブジェクトの属性(アトリビュート)を格納した辞書を返してくれます。

また、オブジェクトに対するvars(obj)は、そのオブジェクトの__dict__属性と同等の結果を返します。__dict__は、オブジェクトに定義されたすべての属性を保持する辞書です。

実行例:vars()と__dict__の比較

class A():
    def __init__(self, id):
        self.id = id

a = A(1)
print("__dict__: ", a.__dict__)
print("vars(a): ", vars(a))

実行結果は以下の通りです。

__dict__: {'id': 1}
vars(a): {'id': 1}

このように、a.__dict__vars(a)はまったく同じ結果を返します。

dir()との違いは?

dir()もオブジェクトの情報を調べるための関数ですが、vars()とは返す形式が異なります。

  • dir(obj):オブジェクトが持つ属性名の一覧(リスト)を返します。クラスやインスタンスが持つメソッド名や特殊属性(__class__など)も含まれます。
  • vars(obj):オブジェクトの属性とその値を対応付けた辞書を返します。ただし、__dict__を持たないオブジェクト(一部の組み込み型など)では使えません。
  • dir()(引数なし):現在のスコープ内の名前の一覧をリストで返します。

つまり、「名前だけ知りたいならdir()」「値まで確認したいならvars()」という使い分けが基本となります。

dir()の実行例

a = A(1)
print(dir(a))
['__class__', '__delattr__', '__dict__', '__doc__', '__eq__', ... , 'id']

最後に'id'が含まれていることが確認できます。これがインスタンス固有の属性です。

まとめ

関数戻り値主な用途
locals()ローカルスコープの変数の辞書関数内の変数を確認
globals()グローバルスコープの変数の辞書モジュール全体の変数を確認
vars()引数なし:現在の名前空間/引数あり:そのオブジェクトの__dict__オブジェクトの属性と値を確認
dir()属性名のリスト利用可能な名前・属性の一覧を確認

デバッグ時や動的に属性を操作したい場合に、これらの関数を使い分けられるようになると、Pythonプログラミングの幅が大きく広がります。

  1. 【Python】Tkinterのroot.destroy()とroot.quit()の違いを徹底解説

    PythonのGUIライブラリ「Tkinter」では、アプリケーションを終了する方法として destroy() と quit() の2つのメソッドがよく使われます。似たような役割に見えますが、実際には動作が異なります。この記事では、それぞれの違いをサンプルコード付きでわかりやすく解説します。 root.destroy()とは tkinterのウィンドウオブジェクトに対して destroy() メソッドを呼び出すと、mainloop の処理が終了し、ウィンドウ内のすべてのウィジェットが破棄されます。つまり、ウィンドウそのものが完全に閉じられ、バックグラウンドで動作しているインタプリタ(Tcl/T

  2. Pythonのtkinterとtkinter.ttkウィジェットの違いとは?スタイリング方法を解説

    tkinter.ttkは、tkinterウィジェットのスタイル(見た目)を設定するためのモジュールです。HTML要素にCSSでデザインを適用するように、tkinter.ttkを使うことでtkinterウィジェットの外観を自由にカスタマイズできます。 tkinterウィジェットとtkinter.ttkの主な違い tkinterウィジェットは、ボタン・ラベル・テキスト・スクロールバーなど、基本的なGUI部品を追加するために使用します。一方、tkinter.ttkは標準のtkinterよりも多くの種類のウィジェットをサポートしています。 tkinter.ttkではPlaceやPack()、Grid