Pythonは名前だらけ

He would answer to "Hi!" or to any loud cry,
Such as "Fry me!" or "Fritter my wig!"
To "What-you-may-call-um!" or "What-was-his-name!"
But especially "Thing-um-a-jig!"

Pythonでもなんでも、プログラムを書くといろんな名前が出てきます。変数名や関数名、クラス名にモジュール名。

次のコードは、100 という数値に、number という名前をつけます。

In [32]:
number = 100
print(number)
100

普通ですね。次のコードは、hoge という名前の関数を作ります。

In [17]:
def hoge():
    print('hello')
hoge()
hello

変数の代入と関数の定義、書き方はちょっと違いますが、実はやっていることはどちらもあまり変わりません。数値の代入は、数値に名前をつけています。関数の定義は、関数に名前をつけています。どちらも、なにかに名前をつけているのです。

この考え方を覚えておいてください。Pythonの

number = 100

は、number という名前の、値が100の数値データを作っているのではありません。

値が 100 の数値データを作り、そのデータを利用できるように、number という名前をつけているのです。データ自身には、名前はありません。

関数の定義も一緒です。

def hoge():
    print('hello')

という定義は、hoge という名前の関数を作るのではありません。新しい関数を作って、hoge という名前で呼び出せるようにしているのです。

名前の操作

数値でも関数でも、あたらしい別の名前もつけられます。次の例は、数値にあたらしく suuchi という名前をつけています。

In [39]:
suuchi = number
print("number is", number)
print("suuchi is also", suuchi)
number is 100
suuchi is also 100

関数にも、おなじように別の名前をつけられます。

In [18]:
fuga = hoge
fuga()
hello

名前は上書きもできます。number という名前を、'番号'という文字列に置き換えてみましょう。

In [19]:
number = '番号'
print(number)
番号

クラスの定義も、同じようにあたらしく名前を作ります。

In [28]:
class Foo:
    def __init__(self):
        pass

print(Foo())
<__main__.Foo object at 0x7f1e6c5f77f0>

このコードは、クラスを作成して、Foo という名前をつけています。これも単に名前に過ぎませんから、別の名前をつけたり、上書きしたりできます。

In [30]:
Foo = "ふぅ"
print(Foo)
ふぅ

名前はみんな平等

Pythonのプログラムには、変数の代入や関数の定義などがありますが、こういった処理では、あたらしく名前が作られます。

数字でも文字列でも関数でもクラスでもモジュールでも、名前はたんなる名前に過ぎません。代入文でも def でもclass でもimportでも、作られる名前はみんな平等で、Pythonは一切区別をしません。

どうやって作った名前でも、同じように値を付け替えたり、別名を付けたりできるのです。

実用的には、数字と関数に同じ名前をつけてしまうのは、あまり上品なプログラマのやることではありません。しかし、

Pythonでは、すべてのデータに名前をつけられる

というのは、Pythonの動作を理解するために重要なポイントです。覚えておいてください。