LoginSignup
121
109

More than 3 years have passed since last update.

いくつ知ってる?_(アンダースコア)と__(ダンダー)の使い方【Python】

Last updated at Posted at 2021-03-13

最近Pythonトリックを読み学びがあったのでメモまで。

概要

  1. ___の読み方知ってます?
  2. Pythonで出てくる___の組み合わせ
  3. 各組み合わせの意味合い
  4. 感想

1. ___の読み方知ってます?

Pythonトリックおすすめです。

  • _:アンダースコア
  • __:ダンダー

と読むらしいです。自分は知らずにアンダーアンダースコアと読んでました(恥ずかしい

2. Pythonで出てくる___の組み合わせ

Pythonで___の組み合わせで主に使われているのは以下の5つ。

  • 変数の先頭の_
  • 変数の末尾の_
  • 変数の先頭の__
  • 変数の先頭と末尾の__
  • 単一の_

3. 各組み合わせの意味合い

組み合わせの意味合いは下記の通り。

変数の先頭の_

これはよく見ます。変数がプライベートであることを示しています。これはPythonのお約束の1つであり、外部からは普通にアクセスできます。

アンダースコアの挙動
class TestUnder():
    def __init__(self,a):
        self._a = a
test = TestUnder(1)
test._a = 2
# _aは書き換わる

変数の末尾の_

定義する変数の末尾にアンダースコアを追加することで名前の衝突をさけることがあります。これもPythonのお約束の1つです。

変数の先頭の__

これも変数がプライベートであることを示しています。
ただし_の場合と違い、プログラム上にも変化を及ぼします。

実はこれは完全なプライベート変数ではなく、
Python側が変数名を変更することで擬似的に作ったプライベート変数です。

アンダースコアとダンダーの違い
class TestUnder():
    def __init__(self,a):
        self._a = a
test = TestUnder(1)
test._a = 2
# _aは書き換わる

class TestDunder():
    def __init__(self,a):
        self.__a = a
test = TestDunder(1)

# Attribute Errorが発生
# print(test.__a)

# 例外は発生せず一見、__aが書き換わるように見えるが、 __init__で設定した変数とは異なる
# test.__a = 2

# 実はこれでアクセスできてしまう
print(test._TestDunder__a)

変数の先頭と末尾の__

よく見る__init__とかの特殊メソッドで使用されます。特別な理由なければ使わないほうがいいでしょう。

単一の_

変数が一時的なものや使用しないものを示すために使用されます。

単一のアンダースコア
test = ('Necessary','Unnecessary')
a,_ = test

感想

それぞれ知ってはいましたが、まとめたことはなかったので勉強になりました。
余談ですが、Pythonトリックいいよ。effective Pythonで挫折した自分でも読めました。
Python トリック(https://www.amazon.co.jp/dp/B085455WKV/)

121
109
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
121
109