Pythonの変数の種類と使い方: グローバル変数、ローカル変数、引数、スコープ、定義方法

265, 2021-06-08

目次

Pythonの変数の種類と使い方

Pythonでは変数を扱うことができます。
変数とは値の入れ物、いわゆるご飯に対する丼ぶりです。

【絵】どんぶり

この記事ではPythonの変数について解説します。
結論から言うとPythonの変数は↓のような種類があります。

a = 1  # a ... グローバル変数

def func(arg):  # arg ... 引数
    b = 2  # b ... ローカル変数

具体的に↓を見ていきます。

  • 変数とは何か?

  • 変数の種類

  • 変数とスコープ

  • 変数の定義方法

  • グローバル変数

  • ローカル変数

  • 引数

変数とは何か?

変数とはいったい何なのかと言うと、これは値を入れる入れ物のことを言います。
ご飯におけるご飯が値で、ご飯を入れる丼ぶりが入れ物です。

【絵】どんぶり

丼ぶりに入れるご飯はチキンライスやカレーライスなどいろいろと入れ替えることができます。
このとき、丼ぶりにチキンライスなどを入れることを変数への値の代入と言います。

【絵】ご飯がどんぶりに

変数、つまり丼ぶりは色々なところへ持ち運びができます。
台所からリビング、リビングから書斎に、と言う風にです。

変数に値を入れて持ち運ぶことでプログラムの利便性が上がり、開発者がプログラムを書きやすくなります。
また、この時変数に入れる値は同時に他の変数で共有することも出来ます。

【絵】複数のどんぶり

たとえばPythonではリストを作れますが、このリストを複数の変数に代入すると、その同じリストをそれぞれの変数から参照することができます。
このような参照を単純に参照と呼ぶことがあります。

変数の種類

変数には種類があります。
大きく分けて↓のような分類になります。

  • グローバル変数

  • ローカル変数

また、ローカル変数の一種で引数という変数もあります。
実際のプログラムでは↑のような変数を使い分ける必要があります。
それぞれその変数の特徴があり、その特徴を知っていないといざコードを書くときに困ることになります。

グローバル変数、ローカル変数、引数の特徴については後述します。
変数を扱う際に一緒についてくる問題が「変数のスコープ」というものになります。

変数とスコープ

変数にはスコープと言うものがあります。
スコープとは「その変数の見える範囲」のことを言います。

プログラムには領域というものがあり、それぞれの領域に変数を置くことによってその変数の名前が変わります。
たとえばグローバルな領域に置かれている変数はグローバル変数。
ローカルな領域に置かれている変数をローカル変数と呼ぶようにです。
このとき、グローバルな領域のことをグローバルスコープ、ローカルな領域のことをローカルスコープと呼びます。

グローバルスコープとはファイルを開いた状態のまっさらな状態のところはすべてグローバルスコープです。
このグローバルスコープに関数やクラス、変数などを書いていくことになります。

いっぽう、ローカルスコープとは関数内などの領域のことを言います。
この領域に置かれている変数をローカル変数と呼びます。

【絵】スコープ

変数の定義方法

変数の定義方法についてです。
定義というのは難しい表現ですが、簡単に言うと「変数の作り方」が変数の定義というものです。

変数を定義するには変数名に対して値を代入します。
つまり↓のような形になります。

変数名 = 値

具体的にコードにすると↓のようなコードになります。

a = 1

↑の場合、aというのが変数です。そしてそのa1という値を代入しています。
これはaというのが丼ぶりで、1と言う値がチキンライスになります。
Pythonが↑のコードを読み込んで実行すると、Pythonはaという変数に1を代入した状態を持つようになります。
こうするとこの変数が見える範囲、つまりスコープの範囲であれば、この変数を使うことができます。
使うというのはprint()で内容を出力したり、if文で変数の値を参照したりと言う風にです。

スコープは変数の定義した場所で決定されます。
変数の定義した場所がグローバルスコープであればその変数はグローバル変数になります。
また定義した場所がローカルスコープであればその変数はローカル変数になります。

グローバル変数

グローバル変数とはグローバルスコープに置かれた変数のことです。
グローバルスコープはたとえば↓のコードを見てください。

# ここはグローバルスコープ
g = 1  # <- これはグローバル変数
# ここもグローバルスコープ

↑のコメントが書かれている部分はすべてグローバルスコープです。
そして↑のgという変数がグローバル変数になります。

グローバル変数は基本的にどこからでも参照することができます。
どこからでも、というのは、関数の中からだったりクラスのメソッドの中からだったりということです。
どこからでも参照できるのがグローバル変数の特徴です。

どこからでも参照できるというと便利なように思えますが、じっさいは場合によってそうでもなかったりします。
一般にグローバル変数が点在するプログラムは管理が難しくなると言われています。
これは変数が限定されず、グローバルな領域にほいほいと置かれてしまうことで、数が増えていくと段々と管理が難しくなるためです。

そのためグローバル変数を使いすぎるとあまり仲間の開発者からは良い顔はされないかもしれません。
ただ関数やクラスなどは別です。グローバルな領域に書かれた関数やクラスは基本的にはOKとされています。
グローバル変数だけがやや肩身が狭い扱いを受けています。

もっともC言語などではグローバル変数を多用するスタイルが、1つの開発スタイルとして定着している所があります。
これはファイル内のグローバル変数が疑似的にクラスのメンバ変数を表現するためです。つまりファイルがクラスで、グローバル変数がメンバ変数かのように扱われます。
このようなスタイルに慣れている開発者はグローバル変数を使うことに抵抗がなく、ほいほいと使う傾向があります。
ですのでまぁ「グローバル変数を使っているからこのプログラムは悪!」というような見方は偏見になる可能性があります。
その辺は色々なスタイルを許容するという意味で覚えておいてもいいかもしれません。

またグローバル変数だけを定義したモジュールと言うのも存在します。
たとえばDjangoというフレームワークではsettings.pyにグローバル変数を大量に定義して使います。
このようなグローバル変数の使い方は一般的でよく使われます。

グローバル変数は扱いが難しい

テンプレ的な使い方はOKってことね

関数内からグローバル変数を参照したい場合はglobal宣言文などを使ってグローバル変数を参照します。
global宣言文によるグローバル変数の参照については↓の記事を参照してください。

ローカル変数

ローカル変数とは、ローカルスコープに置かれた変数のことを言います。
ローカルスコープとはたとえば関数内やクラスのメソッド内のことを言います。
コードにすると↓がローカル変数です。

def func():
    # ここはローカルスコープ
    a = 1  # aはローカル変数
    # ここもローカルスコープ

↑のようにグローバルスコープにfunc()という関数を定義します。
そうするとfunc()の中はローカルスコープになります。
このローカルスコープに書かれる変数はローカル変数になります。

ローカル変数は、そのローカルスコープからのみ参照できます。
つまりグローバルスコープや他のローカルスコープからは参照できないということになります。
たとえば↓のような風にです。

# ここからfunc1のaは参照できない

def func1():
    a = 1
    # ここからはaを参照できる

# ここからfunc1のaは参照できない

def func2():
    # ここからfunc1のaは参照できない
    pass

このようにローカル変数は、その利用が局所化されます。
つまり狭い領域でのみ使える変数ということになります。

引数

カテゴリ的にはローカル変数に分類されますが、関数の引数も変数の一種です。
関数の引数は↓のようなものです。

def func(arg1, arg2):
    pass

↑の場合、arg1arg2は引数(厳密に言うと仮引数)ですが、この引数は変数と同じように扱えます。
そしてそのスコープは関数内に限定されます。つまりarg1arg2func()の中でのみ使えます。

おわりに

今回はPythonの変数について見てみました。
変数は基本的な機能ですが、けっこう奥が深いですよね。

変数はスコープが大事

スコープを通して変数を見よう