😎
Pythonのアンダースコア _ の全て:7つの意味と文脈を完全整理
_
の全7パターン徹底解説
🐍 Pythonのアンダースコア _
(アンダースコア)は、Pythonで文脈に応じて7通り以上の意味を持つ超多機能記号。
慣習、内部設計、国際化、REPL……
Pythonの哲学がぎっしり詰まっています。
🎯 本記事の目的
Pythonにおけるアンダースコアの使い方と意味を、体系的にすべて整理する
_
の使い方【7パターン一覧】
📚 # | 書き方 | 主な用途 | 概要 |
---|---|---|---|
① | _ |
🗑️ 無視する変数 | for文やアンパックで「使わない」と明示 |
② | _var |
🔒 内部用変数(慣習) | 外部から使わないでね、の合図 |
③ | var_ |
🚧 予約語の回避 |
class , from などと衝突しないため |
④ | __var |
🥷 名前マングリング | クラス外からアクセスしにくくする |
⑤ | __var__ |
✨ マジックメソッド |
__init__ , __len__ などPython構文専用 |
⑥ | _ = expr |
💭 REPLの直前結果 | 対話モードで前の出力を再利用できる |
⑦ | _() |
🌐 i18n(国際化)関数 | 翻訳関数 gettext() のエイリアス |
🔍 詳細解説
_
(無視する変数・捨て変数)
1️⃣ -
🧠 意味
この値は使わないから名前なんて不要、という合図。 -
🛠 使い所
for _ in range(3): print("hello") # ループ変数を無視 x, _, y = (1, 99, 3) # 真ん中の値を無視 list(map(lambda _: "ok", range(5))) # 引数を無視
-
📌 ポイント
- あくまで「人間への合図」。
- 実体は普通の変数。上書きすれば通常の値に。
_var
(内部実装用変数・慣習)
2️⃣ -
🧠 意味
内部的に使う変数・関数です。外部には公開しないでね、のサイン。 -
🛠 使い所
class Foo: def __init__(self): self._cache = {} foo = Foo() print(foo._cache) # ⚠️ アクセスできるけど、控えてね
-
📌 ポイント
- Pythonに本当の
private
はないので、ソフトプライベートとして扱う。 - ライブラリのドキュメント外APIの目印にもなる。
- Pythonに本当の
var_
(予約語回避)
3️⃣ -
🧠 意味
Pythonの予約語(class
,from
,lambda
, …)と名前が被らないように回避。 -
🛠 使い所
from_ = "Tokyo" class_ = "Car" lambda_ = lambda x: x + 1
-
📌 ポイント
- 末尾に
_
を付けるだけで衝突回避。 - 動作に制限はなく、普通の変数として利用可能。
- 末尾に
__var
(名前マングリング)
4️⃣ -
🧠 意味
クラス内だけで使うように“見せる”ための仕組み。
Pythonが自動で名前を変換(Name Mangling)してくれる。 -
🛠 使い所
class A: def __init__(self): self.__secret = 42 a = A() print(a.__secret) # ❌ AttributeError print(a._A__secret) # ✅ アクセス可能
-
📌 ポイント
- 完全な
private
ではないが、誤用を防ぐ防衛線。 - 継承時の名前衝突も避ける。
- 完全な
__var__
(マジックメソッド/特殊変数)
5️⃣ -
🧠 意味
Python構文や仕組みに深く結びついた特別な名前。
“ダンダーメソッド”とも呼ばれる。 -
🛠 使い所
class MyClass: def __init__(self, v): # インスタンス生成時 self.v = v def __str__(self): # print(obj)の出力 return f"MyClass({self.v})" def __len__(self): # len(obj) return self.v
-
📌 ポイント
- Python内部が自動で呼び出す“契約名”。
- 自作は仕様厳守。
__mycustom__
などは非推奨。
_ = expr
(REPLでの直前評価結果)
6️⃣ -
🧠 意味
インタラクティブシェル(REPL)で最後に評価された式の結果が自動的に_
に格納される。 -
🛠 使い所
>>> 10 + 5 15 >>> _ * 2 30 >>> print(_) # 30
-
📌 ポイント
- REPL限定の機能。スクリプト中では無効。
- 自分で
_ = …
と書くと上書きされ、特殊動作を失う。 - IPython/Jupyterではさらに
_i, _ii, _oh
などの履歴変数あり。
_()
(国際化・翻訳関数エイリアス)
7️⃣ -
🧠 意味
国際化(i18n)の翻訳関数gettext()
を_()
として呼び出す慣習。 -
🛠 使い所
from gettext import gettext as _ print(_("Hello, world!")) # 翻訳された文字列を表示
-
📌 ポイント
- Django、Flask、GNU gettext などで広く使われる。
-
_()
があると“翻訳対象文字列”としてマークされる。
📦 まとめ(全7パターン)
書き方 | 目的 | 主な使い所 |
---|---|---|
_ |
🗑️ 無視する変数 |
for _ in … / x, _, y = …
|
_var |
🔒 内部用変数(慣習) | self._cache |
var_ |
🚧 予約語回避 | from_ = "Tokyo" |
__var |
🥷 名前マングリング | self.__secret |
__var__ |
✨ マジックメソッド |
__init__ , __len__ , … |
_ = expr |
💭 REPLでの直前評価結果 |
>>> 3*7 → 21 → >>> _ + 1 → 22
|
_() |
🌐 翻訳関数エイリアス(i18n) | _("Welcome") |
💡 補足
Pythonのアンダースコアは、単なる記号を超えた、“設計者とコミュニティの暗黙の対話”。
Explicit is better than Implicit — 明示は暗黙に勝る
この思想が、アンダースコアの多彩な使い方に息づいています。
Discussion