【Python】地味だけど超重要!アンダースコア(_)の5つの役割を徹底解説
こんにちは。ゆうせいです。
Pythonのコードを読んでいると、時々 _
という、なんとも不思議な変数名に出会うことはありませんか? 「これはタイプミス?」「何かの省略形?」と、首をかしげた経験があるかもしれませんね。
実はこのアンダースコア(_
)、見た目は地味ですが、文脈によって様々な意味を持つ、まるで名脇役のような存在なのです。
今回は、このアンダースコアが持つ5つの主要な役割を一つずつ解き明かしていきましょう。これを理解すれば、あなたのPythonコードの読解力は格段にアップしますよ!
アンダースコアが演じる5つの役割
アンダースコアは、その使われ方(どこに、いくつ使われるか)によって、全く違う意味を持ちます。さっそく、その「5つの顔」を見ていきましょう。
役割1: 「この値は使いません」という意思表示
最もよく見かけるのが、変数名として _
が単体で使われるパターンです。これは、「この場所に値は入ってくるけれど、後の処理で使う予定はありません」というプログラマーの意思表示です。
例えば、単純に処理を5回繰り返したいだけで、ループカウンタの数字(0, 1, 2, 3, 4)には興味がない場合、このように書きます。
for _ in range(5):
print("Hello, Python!")
また、複数の値を一度に受け取る時(アンパックと呼びます)に、不要な値を捨てるためにも使われます。
# (x, y, z) の座標データのうち、xとzだけが必要な場合
point = (10, 20, 30)
x, _, z = point
print(f"x={x}, z={z}") # y=20は無視される
_
を使うことで、「この変数は意図的に無視していますよ」と、コードを読む他の人に親切に伝えられるのですね。
役割2: 「内部用です」という目印 (例: _variable
)
変数名やメソッド名の先頭にアンダースコアを一つ付けると、「これは内部だけで使うことを想定したもので、外から直接呼び出すのは推奨しません」という、一種の目印になります。
これは「プライベート変数」とも呼ばれますが、Pythonでは厳密なプライベート(外部から絶対にアクセスできない仕組み)は存在しません。あくまで、「触らない方がいいですよ」という開発者同士の紳士協定のようなものです。
例えるなら、お店のバックヤードにある「関係者以外立ち入り禁止」のドアのようなもの。鍵はかかっていないので入ろうと思えば入れますが、入らないのがマナーですよね。
このルールには一つだけ強制力があります。from a_module import *
という書き方でモジュールを読み込んだ際に、_
で始まる名前の変数や関数はインポート対象から除外されるのです。
役割3: 「キーワードとの衝突回避」の知恵 (例: variable_
)
Pythonには、for
や if
、class
のように、言語の機能として予約されていて変数名として使えない「キーワード」があります。
しかし、プログラムを書いていると、どうしても class
という名前の変数が使いたくなる時があります。例えば、CSSのクラスを指定するような場合です。そんな時に、このパターンが役立ちます。
# "class"はキーワードなので変数名にできない
# def create_element(tag, class): ... # これはエラーになる
# 末尾に _ をつけることで、キーワードとの衝突を回避する
def create_element(tag, class_):
print(f"<{tag} class='{class_}'>")
create_element("p", "main-text")
このように末尾に _
を付けることで、キーワードとの衝突をスマートに避けられるのです。
役割4: 「名前の書き換え」による衝突防止 (例: __variable
)
アンダースコアを先頭に二つ付けると、少し特殊な動きをします。これは主に、クラスの継承という場面で効果を発揮する、少し上級者向けのテクニックです。
一言で言うと、「サブクラス(子クラス)で、意図せず親クラスの属性を上書きしてしまう事故を防ぐ」ための機能です。
Pythonは、__
で始まる名前を見つけると、それをこっそり _クラス名__変数名
という形に書き換えます。これを「名前マングリング(名前修飾)」と呼びます。
これにより、たとえ親子で同じ __variable
という名前を使っていても、内部的には別物として扱われるため、予期せぬ衝突が起こらない、というわけです。
役割5: 「特別な役割を持つ」魔法の印 (例: __variable__
)
先頭と末尾を二つのアンダースコアで囲まれた名前は、Pythonの世界で非常に特別な意味を持ちます。これらは「特殊メソッド」や「マジックメソッド」と呼ばれ、「Dunder(Double Underscoreの略)」という愛称で親しまれています。
あなたも __init__
というメソッドは見たことがあるかもしれませんね。これは、クラスからオブジェクトが作られる時に、自動的に呼び出される特別なメソッドです。
他にも、len()
関数が使われた時に呼ばれる __len__
や、+
演算子が使われた時に呼ばれる __add__
など、たくさんのDunderメソッドが存在します。これらを自分で定義することで、自作のオブジェクトをPythonの基本的な操作に対応させることができるのです。
まとめ:アンダースコアを使いこなそう
最後に、今日見てきた5つの役割を表で整理してみましょう。
パターン | 通称 | 主な目的 |
_ | 捨て変数 | 使わない値を格納する。 |
_var | 内部変数 | 外部からの利用を意図しないことを示す。 |
var_ | 後置アンダースコア | Pythonキーワードとの名前の衝突を避ける。 |
__var | プライベート変数 | クラス継承時の名前の衝突を避ける(名前マングリング)。 |
__var__ | Dunderメソッド | Pythonの特定の構文や操作に紐づく特殊なメソッド。 |
いかがでしたか?
アンダースコア一つとっても、これだけ多様な意味が込められているのが、Pythonの面白いところです。
新人エンジニアのうちは、まず最初の3つ、「捨て変数」「内部変数」「キーワード衝突回避」をしっかり覚えておけば十分です。コードを読んでいて __
(アンダースコア2つ)が出てきたら、「ああ、クラスに関する少し特別なやつだな」と思い出せるだけで、全く問題ありません。
これらの小さなルールを一つずつ理解していくことが、綺麗なコードを読み書きできるエンジニアへの確かな一歩となります。ぜひ、明日からのコーディングで意識してみてください!