【今日のQ&A】画期的な変数名の使い回し

こんにちは、@codeship_techです。

もしかしたら「名前空間ってなに?」となる方もいるかもしれません。

もし知らないという方や知ってるけど理解が曖昧という方はぜひこの機会に理解しましょう!

名前空間って何ですか?

変数名や関数名が有効な範囲のことです。
名前がカブることを避けるために用います。

空間内に変数名は一つだけ

例えば、あるプログラムの中でoutputという変数名をつけたとします。
これは「掛け算の結果(出力)」という意味でoutputという名前をつけたものとします。

output = x * y

しかし、もし後に同じプログラムの中で、outputという変数名を「引き算の結果の出力」と、別の意味で使いたくなったらどうすればよいでしょうか。

output = x - y

これでは先に定義した掛け算の結果であるoutputが上書きされて消えてしまいます。
このように、既にある変数名が後につける変数名と被ってしまうことが、プログラミングをする上では往々にしてあります。

この問題の対処法として

output2 = x - y #番号をつけてみる
output_diff = x-y #名前を長くしてみる

のように、変数に番号をつけてみたり、意味を付加して名前を長くし区別してみたりする方法があります。

が、あるにはあるのですが、これらもそれぞれoutputという名前を使いたい変数が増えてくるほどに管理が面倒になります。
根本的な解決にはなっていません。

名前空間(namespace)

そこで、名前空間(namespace)やスコープ(scope)が登場します。

名前空間は関数名や変数名が有効な範囲を限定することで、

  • 掛け算の結果は名前空間Aのoutput
  • 引き算の結果は名前空間Bのoutput

と、同じ名前を厳密に区別することができます。

名前空間を区別する方法としては、言語に限らず共通なものは

  • 関数の中で定義する
  • クラス、モジュール、インタフェースの中で定義する

という方法があります。

以下はPythonの関数の内部で名前空間を分ける例です。
multiという関数とdiffという関数がそれぞれ別の名前空間として機能しています。

def multi(x, y):
   output = x * y
   return output


def diff(x,y) :
   output = x - y
   return output

ちなみに名前空間で区別されていない、全体の空間のことを「グローバル空間」と言います。
グローバル空間にはシンプルでよく使われそうな変数名を書かずに、関数やクラスの内部に区別して書くのがよいプログラムのミソです。