Python入門 - 変数とは何か? プログラム上で一時的に保持するデータについて
本ページではPythonの入門コンテンツとして初学者向けにPythonでの変数の取り扱い方法について記載します。
「変数」という概念の説明#
変数 (variable) というものをご存じでしょうか。ご存じの場合はこのセクションは読み飛ばしていただいてOKです。
変数というものは、数学で出てくる単語として記憶されている方も多いかもしれませんね。例えば、次のような数式があった場合の x を変数と呼んだりしますね。
この場合の変数とは自由に変化する数、ということで変数と呼ばれます。プログラム上でも、おおよそ似たような存在です。
と言ってもよくわからないかもしれないので実際の例を見ながら説明していきます。
変数を具体的に見てみる#
以下は変数を使ったコードです。変数は a です。一度手元の環境で実行してみてください。
a = 10
print(a)
出力は以下のようになったかと思います。
10
これは以下のようなことが実施された結果です。
a に対して 10 という数値を設定した
print() によって a の値を出力した → 10 が出力された
お判りでしょうか。
続けて次の例も見てみます。
b = 120
print(b)
b = 19
print(b)
出力結果は以下のようになります。
120
19
これは次のような動作が行われたために生じました。
b に対して 120 という数値を設定した
print() によって b の値を出力した → 120 が出力された
b に対して 19 という数値を設定した
print() によって b の値を出力した → 19 が出力された
なんとなくお分かりいただけたでしょうか。次のセクションで説明させていただきます。
変数 = データの一時置き場#
変数とは、一時的にデータを保存しておく場所です[1] 。
プログラムを書いていると、色々な情報をどこかにおいておく必要が出てきます。例えば今ご利用のWebブラウザを例にとってお話をします。
Webブラウザでは現在訪れているページの情報を持っておく必要があります。これはアドレスバーの中に表示されているページのURLだったり、そのページのどのあたりまでスクロールしているかといった情報であったり、そもそも表示しているページを作るためのデータ(HTML, CSS, JavaScriptなど)であったりします。
また、Webブラウザでは戻るボタンや進むボタンというものがあります。この機能を実現するためには、今見ているページを見る前にどこにアクセスしていたかというURLの情報や、このページからどこか別のページにリンクを利用して移動していた場合にはその情報を進むボタンの為に持っておく必要があります。
これ以外にも数多くのデータを利用し、Webブラウザというものは動いていますがそれらのデータをどこかに覚えておかなければいけません。このように現在の動作に必要な情報などをどこかに持っておく時に利用されるものが変数です[2] 。
Webブラウザ以外の例でいうと、例えばゲームであればプレイキャラの見た目、現在位置、向いている方向、装備しているもの、現在の体力・スタミナ・状態異常、各種のステータス値、現在カメラが向いている方向とカメラの位置、見えている景色をどこまで描画するかの設定、描画する際のクオリティー設定、環境音がなる場合その方向や音量、所持金や経過時間、ゲーム内日時 ... などなどあらゆる設定値が変数として保持されているはずです。
変数の利用なくしてはプログラムは記述ができないといってよいでしょう。変数はとっても大事な存在です。
変数の利用方法#
ではPythonにおける変数の具体的な利用方法について説明していきます。
変数の一生#
変数の基本的なライフサイクルは次のようなものです。
変数として宣言 (declare) される
変数に値を代入 (assign) する
変数を利用する
変数が削除される
変数の宣言と代入#
変数の宣言、というと大げさなものに聞こえますが、 宣言とは単に「こういう変数をこれから使います」という宣言です。
そして変数の 代入というのは 「この変数にこの値を設定してください」という命令です。 そして、Pythonではほとんどの場合において宣言と同時に値が代入されます[3] 。そのためこれ以降では単に代入として説明します。
Pythonでは変数の代入は以下のように行います。
<変数名> = <値>
具体的な例は先ほどのセクションで出ていたものです。以下に再掲します。
a = 10
この例では a という変数に対して 10 という値を「代入」しています。
Pythonの場合どのようなデータであっても変数に代入することが可能ですので、以前説明した文字列 ( str 型) のデータを詰めることもできます。
moji = '文字列だよ'
また、 Pythonにおいて変数は上書きが可能 である点に注意してください。うっかり同じ名前の変数に新しく値を代入してしまうとデータが書き換わってしまいます。
a = 10
# この a を使って何かを実施 ...
# しばらくして 新しい変数が必要に、適当に a という名前を付けてしまうと...
a = '新しいデータ'
# 後で利用しようとした際に上書きされてしまっている
print(a)
また、代入と同時に計算を行うこともできます。
# a に3を足したいとき
a += 2
# a を2倍にしたいとき
a *= 2
これは以下のコードと同じ動作になります。
a = a + 2
a = a * 2
この = の前に計算記号を付与する方式を用いると、上記のように省略して計算と代入を実施することが可能です。
上の例では + と * だけを取り扱っていますが、それ以外の計算記号でも基本的に利用可能です。
変数にはどのようなデータを入れることができる?#
変数にはデータであれば何を入れてもOKです。文字列であっても、数値であっても、今後紹介する関数やクラスといったものであってもOKです。
例えば今まで紹介したような print() や type() といった関数も入れることが可能です。これらの機能は少し高度なプログラミングをする場合に利用されることがあります。呼び出す関数をプログラムの状態によって動的に変化させたい場合などです。
# カッコはいらない
a = print
# こうすると a を print の代わりとして利用できる
a('文字が出力できる!')
注意点として、流石にPythonの文法上の単語などは入れることはできません。
変数名について#
ところで、 変数名 というものとしてこのページでは a とか b とか実用性のなさそうな名前ばかり利用していますが、実際のところどのようなものが設定可能なのでしょうか。
Pythonでは 変数名は以下の条件をすべて満たしている必要があります。
以下のいずれかの文字で構成されていること
a ~ z (大文字含む) のアルファベット
0 ~ 9 の数字
アンダーバー ( _ )
先頭は必ずアルファベットでなくてはならない
Pythonでは変数名はできる限り英単語ベースで、単語間の区切りはアンダースコアで表現する、という方式が取られることが多いです。大文字を使うことは推奨されません[4] 。例えば以下のような形です。
url
previous_address
world_camera_direction
このページで利用しているような a とか b は推奨されない変数名です。実際にコードを記述する際には意味の通る英語の組み合わせなどを検討してください。
変数はプログラム中でいくつも登場するものであるため、名前だけで何に利用されるかわかるようにしておくことが非常に重要です。まだ先の話かもしれませんが、特に複雑なプログラムを記述する際によくよく考えて名前を付けるようにして下さい。
補足: 変数の「型」について#
C言語 などを知っている方は表題の件を疑問に思うかもしれません。C言語などでは int 型であったり char 型であったりといった型が変数にも付与されています。しかし、Pythonでは特に型を明示していません。それどころか、後から色々な型のデータで上書きすることさえできてしまいます。
それはPythonが動的型付け言語 (dynamically typed language) 、と呼ばれる仕様を持っているためです。Pythonではプログラムを書いている間は変数の型が何かなどを全く気にすることはなく、代わりにプログラムの実行時にこれらの情報をプログラム実行者側が気にしています。
Pythonは スクリプト言語 と呼ばれ、Pythonスクリプトを記述した後にコンパイルといった操作を必要としません。これはPythonスクリプトというものが実行される段階でシステムが実行可能なバイナリに変換されるためです。つまり実行時にコンパイルをしている、といったイメージです。Pythonスクリプトは中間言語にコンパイルされ、それらの中間言語をvirtual machineという実行プログラムが解釈し実際にCPUが理解可能なバイナリ命令に変換します。このような動作をするためプログラムの記述時にはコンパイルが必要な言語のように厳密なチェックが入りません。これを逆手にとって自由な記述ができるようになっているのですね。
しかし、逆にこの機能はプログラムが大きくなるにつれて混乱を招きます。誰かが意図しない変数を代入してしまいおかしな挙動に陥ったりする可能性が出てくるためです。こういったものを防ぐために、Pythonにおいても静的型付けをサポートしようと typing という機能が Python 3.5 より導入されました。
この Python の変数に関する仕様は良いところもあれば、悪いところもあるということですね。
変数の利用#
値を代入した後の利用方法について説明します。
先ほどの例において、 a という値は 10 という値が代入されたので 10 としてふるまうようになります。例えば以下のコードは a を 10 に置き換えた場合と全く同じ動作をするようになります。
print(a)
print(a + 100)
print(a * 20)
これが変数の効果です。 特定のデータに対して別名を与えている ものだと認識するとわかりやすいかと思います。
変数の削除#
変数をもう利用しなくなった、といった際に変数を消しておかないと行儀が悪いように思うかもしれません。
Pythonでは変数は誰からも利用されなくなった際に自動的に削除されます。このため、プログラムを書く人は 変数を代入した後片付けについて気にする必要はありません。 これは Python のメリットの1つ言えます。
変数を文字列の中に表示する (f-string)#
今後の説明時に楽になるのでここで説明します。
適当な変数を作成してその内容を表示するのに今まで print(a) といったすごく単純な表示をしてきました。しかし、これはちょっとわかりづらいですよね。この print() 関数を連続で利用した際にどの値がどれなのか判別がつかなくなってしまいます。
そこで文字列の中に変数を埋め込むのに便利な f-string (formatted string literal の略称) を紹介します。
f-stringの例#
実例を見てみます。
a = 10
print(f'a = {a}')
これを実行すると、以下が出力されます。
a = 10
上記のコード例において {a} と記述している部分が 10 に置き換わっていますね。これが変数の文字列への埋め込み、 f-string の機能です。
f-stringは今まで利用してきた文字列の宣言の最初に f という文字を付けます。
# 今までの文字列
'文字列だよ'
# f-string
f'文字列だよ'
そして、変数を埋め込みたいところに 波カッコ {} を置き、その中に変数の名前を入れることでその変数を文字列の中に埋め込むことが可能となります。複数個の変数を埋め込むことも可能です。
number = 100
number2 = 200
print(f'numberの値は {number} で、 number2 の値は {number2} です。')
慣れていないとちょっとびっくりする記法なのですが、慣れるとこれほど便利な機能はありません。
ちなみに、 {} には変数を埋め込む、記載しましたが実際には Python で評価可能な式であれば何でも入れてOKです。
print(f'この中に掛け算とか入れてもOK -> {2 * 200}')
まとめ#
本ページではプログラムにおける変数の概念説明、およびPythonでの変数の利用方法と表示方法について説明しました。
変数はプログラムの状態を保存したり読み出したりするために利用される非常に重要な機能の1つです。この後の入門コースでもこの変数をどんどん利用して行くことになりますので、ぜひ概念を理解していただければと思います。