【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には、forifclass のように、言語の機能として予約されていて変数名として使えない「キーワード」があります。

しかし、プログラムを書いていると、どうしても 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つ)が出てきたら、「ああ、クラスに関する少し特別なやつだな」と思い出せるだけで、全く問題ありません。

これらの小さなルールを一つずつ理解していくことが、綺麗なコードを読み書きできるエンジニアへの確かな一歩となります。ぜひ、明日からのコーディングで意識してみてください!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。