変数とは「名前」を付けること
Pythonにおける変数は、値に付ける名前のようなものです。変数名を書き、イコール記号を挟んで、値を書く。これだけです。
変数3つ、値3つ、型3つ。Pythonは何の型かを事前に伝えなくても、それぞれをそのまま並べて保持してくれます。値は = の後ろ、名前は = の前、というシンプルなルールです。
変数を一度作ってしまえば、あとはその値そのものを書くのと同じ感覚で、どこでも使えます。
名前が良いおかげで、下から2行目のコードはそれだけで意味が伝わります。変数名がしっかりしていると、コードが説明文のように読めるようになる。これこそが最大のメリットです。
代入は数学の「等号」ではない
数学の授業から来た人がつまずきやすいポイントがあります。Python の = は「等しい」という意味ではありません。「代入する」という意味です。つまり「= の後ろにある値を、前にある名前に結びつけなさい」ということ。Python はまず値を評価し、それから代入を行います。
なので、次のようなコードもまったく問題なく動きます。
count = count + 1 という書き方は、「count と count+1 が等しい」という数学的な主張ではありません(そもそも成り立ちません)。これは、まず count + 1 を計算して、その結果を count に代入し直す、という意味です。Python はまず式を評価し(0 + 1 なら 1 を得る)、そのあとで変数を更新します。
count = count + 1 は頻出なので、Python には省略記法が用意されています。count += 1 と書けば同じ動きになります。
再代入は値を書き換えるのではなく、ラベルを付け替える
Python の変数は、いつでも別の値を指すように変更できます。元の値そのものが書き換わるわけではなく、変数が別のものを指すようになるだけです。
最後の行に注目してください。mood は2行の間は文字列を保持していたのに、次の行では急に整数に変わっています。それでも Python は何も文句を言いません。これが「動的型付け(dynamic typing)」です。Python では変数自体に型があるのではなく、値のほうに型があります。プロトタイピングのときはこの柔軟さが便利ですが、関数の途中で気づかないうちに変数の意味が変わってしまうと、途端に厄介な存在になります。安全な使い方としては、値の中身にふさわしい名前を選び、その変数が表す「ひとつの意味」を寿命の最後まで変えないことです。
Python の変数名のルール
Python で使える変数名の条件は次のとおりです。
- 先頭は英字またはアンダースコア(
_)で始めること。 - 使える文字は英字・数字・アンダースコアのみ。
- 予約語(
if、for、class、returnなど数十個)は使えない。
たとえば、次の名前はすべて有効です。
次の名前はNGです:
2nd_user— 数字から始められません。user-name— ハイフンは使えません(Pythonは引き算として解釈してしまいます)。class— 予約語です。user name— 名前に空白は入れられません。
すでにお気づきの通り、変数名は大文字・小文字を区別します。total、Total、TOTAL はすべて別の変数として扱われ、Pythonはタイプミスを指摘してくれません。
命名規則(ネーミングルール)
絶対的なルールに加えて、Pythonコミュニティにはお決まりの命名規則があります。インタプリタが強制するわけではありませんが、エコシステム全体で広く共有されている慣習です。
lower_snake_case(python snake_case)は通常の変数や関数に使います:retry_count、fetch_profile。UPPER_SNAKE_CASEは定数に使います:MAX_RETRIES = 5。PascalCaseはクラス名用(これは後の章で扱います)。- 先頭アンダースコア(
_something)は「この名前はプライベート扱いです」というヒント。強制力はなく、あくまで慣習です。 - 末尾アンダースコア(
class_)は、予約語とかぶってしまう名前を使いたいときに役立ちます。
これらに沿って書いておけば、あなたのコードもほかのPythonistaが書くコードと同じ雰囲気になります。
名前は「意味」を伝えるものに
変数名を打つのは一瞬ですが、読むのはずっと大変です。数文字ぶん余計にタイプして、値の意味がちゃんと伝わる名前を選んでおくと、あとで読む人(たいていは未来の自分)が目を細めて悩む時間をぐっと減らせます。
比べてみましょう:
コードは同じ、出力も同じ。でも、何をやっているのか伝わるのは2番目のほうです。i、n、x みたいな短い名前は、ループカウンタのようなごく狭いスコープなら問題ありませんが、それ以外の場面ではきちんと意味のわかる名前を付けましょう。
Python 変数の複数代入(使いどころは控えめに)
Python では、複数の変数に同じ値を一行で代入できます。
または、複数の値をまとめてアンパックすることもできます。
どちらも、コードが読みやすくなる場面(関数の戻り値をアンパックする場合など)では問題なく使えます。ただし最初の書き方 — = = = のチェーン — には少し注意が必要で、3つの変数がすべて 同じオブジェクト を指すことになります。これはリストのようなミュータブルな型では重要なポイントで、後ほど詳しく触れます。
この章のまとめ
name = valueで変数を作成する。- 型を持つのは変数ではなく値。
- 変数名には、守るべき厳格なルールと、いくつかの緩やかな慣習があり、どちらも大切にする価値がある。
- 分かりやすい命名は、最も手軽なドキュメントになる。
次は、Python が実際にサポートしている値の種類 — 整数、浮動小数点数、文字列、真偽値 — と、それぞれを区別しておくことがなぜ役立つのかを見ていきます。
よくある質問
Pythonで変数を作るにはどうすればいい?
名前を決めて、= の右側に値を書くだけです。たとえば age = 30 と書けば、age という名前の変数に 30 が入ります。型を宣言する必要はなく、Pythonが自動で判断してくれます。
Pythonの変数名に使えるルールは?
使えるのは英字・数字・アンダースコア(_)で、先頭に数字は使えません。if や class のような予約語もNGです。また大文字と小文字は区別されるので、total・Total・TOTAL はそれぞれ別の変数になります。慣習としては lower_snake_case(小文字+アンダースコア区切り)が一般的です。
Pythonの変数は途中で型が変わっても大丈夫?
大丈夫です。Pythonは動的型付けなので、同じ変数に最初は数値、あとから文字列を入れる、といったことも可能です。ただし便利な反面、関数の途中で変数の意味が変わるとバグの温床になりがち。そういうときは別名の変数を用意するのがおすすめです。