【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つ)が出てきたら、「ああ、クラスに関する少し特別なやつだな」と思い出せるだけで、全く問題ありません。
これらの小さなルールを一つずつ理解していくことが、綺麗なコードを読み書きできるエンジニアへの確かな一歩となります。ぜひ、明日からのコーディングで意識してみてください!
セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク
投稿者プロフィール
- 代表取締役
-
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。
最新の投稿
山崎講師2025年10月27日重回帰分析はディープラーニングの「細胞」だった?"ご先祖様"と"最強の進化系"のつながりを徹底解剖
山崎講師2025年10月27日機械学習の"ご先祖様"?重回帰分析が今も最強の「基礎」である理由
山崎講師2025年10月27日ディープラーニングの「常識」を疑え!相関分析が“無力”に見える理由と、それでも使うべき本当の価値
山崎講師2025年10月27日相関分析は最強の「データスカウト」!機械学習の精度を上げる”相棒”の正体とは