プログラムで値を扱う最初の一歩が「変数」です。
Pythonでは型の宣言が不要で、やさしく始められる一方で、代入のルールや命名のスタイルを正しく理解しないと、思わぬエラーや読みづらいコードにつながります。
この記事では、変数の基本から代入の書き方、命名規則、つまずきやすいエラーまでを順に丁寧に解説します。
ステップ1: Pythonの変数の基本
変数の役割(値に名前を付ける)
変数は、値にわかりやすい名前を付けて再利用しやすくするための仕組みです。
値そのものを毎回直接書くのではなく、意味のある名前にひも付けることで、読みやすさと変更のしやすさが大幅に向上します。
例
# 値に名前を付けることで、何を表すのかが明確になります
message = "Python"
version = 3
print("message =", message) # 変数名を通じて値を参照する
print("version =", version)
message = Python
version = 3
補足: 「箱」のたとえとPythonの実際
変数を「箱」として説明することがありますが、Pythonでは「名前がオブジェクトにひも付く」イメージがより正確です。
同じ値でも、再代入すると別のオブジェクトに名前が結び直されることがあります。
はじめのうちは「値にラベルを貼る」感覚で捉えて大丈夫です。
動的型付け(型の宣言は不要)
Pythonは動的型付けの言語です。
int
やstr
のような型を事前に宣言しなくても、代入した値に応じて自動的に型が決まります。
同じ変数名に、後から別の型の値を入れ直すこともできます。
例
# 最初は整数が入っている
x = 10
print(type(x)) # 型を確認する
# 別の型の値に差し替えることができる
x = "ten"
print(type(x))
<class 'int'>
<class 'str'>
注意点
動的型付けは柔軟ですが、思わぬ型の混在を招くこともあります。
同じ変数名に別の型を入れ直す時は、後で読む人に意図が伝わるかを意識しましょう。
型ヒントx: int = 10
のような書き方もありますが、機能として必須ではありません。
ステップ2: 代入の使い方(=)を順に学ぶ
単純な代入と再代入
=
は「右辺の値を左辺の名前に結び付ける」演算子です。
同じ名前に再び代入すれば、値を更新できます。
例
# 単純な代入
count = 1
print("count =", count)
# 再代入で値を上書き
count = 2
print("count =", count)
# 既存の値を使って更新することもあります
# 計算の詳細は別の記事で扱いますが、ここでは再代入の例として扱います
count = count + 1
print("count =", count)
count = 1
count = 2
count = 3
ポイント
- 代入は必ず「右から左」へ評価されます。
- 代入は式ではなく文です。
x = y = 0
のような連鎖代入は可能ですが、可読性に注意しましょう。
複数代入とアンパック
Pythonでは複数の名前に同時に値を割り当てたり、リストやタプルから値を取り出す「アンパック」ができます。
コードが簡潔で意図が明確になります。
例
# 複数代入: 右辺をタプルのように並べて左辺に対応づける
a, b = 1, 2
print(a, b)
# アンパック: シーケンスから取り出す
x, y, z = [10, 20, 30]
print(x, y, z)
# スターアンパック: 可変個を受け取る
head, *middle, tail = [1, 2, 3, 4, 5]
print(head, middle, tail)
# 使わない値はアンダースコアで受ける慣習があります
name, _ = ("Taro", "unused")
print(name)
1 2
10 20 30
1 [2, 3, 4] 5
Taro
よくある間違い
アンパックでは、左辺の数と右辺の要素数が合わないとエラーになります。
# 要素数が多すぎる例
a, b = [1, 2, 3]
ValueError: too many values to unpack (expected 2)
値の入れ替え(同時代入)
一時変数を使わずに、2つの変数の値を入れ替えられます。
Pythonならではの読みやすい書き方です。
例
a = 1
b = 99
print("before: a =", a, ", b =", b)
# 同時代入で入れ替え
a, b = b, a
print("after: a =", a, ", b =", b)
before: a = 1 , b = 99
after: a = 99 , b = 1
補足
この書き方は内部でタプルのパックとアンパックが行われています。
読み手に意図が一目で伝わるため、Pythonでは標準的な手法です。
ステップ3: 変数の命名規則とスタイル(PEP 8)
有効な変数名の条件
Pythonの変数名は、以下の文字の組み合わせで作ります。
- 英字またはアンダースコア
_
で始める - 2文字目以降は英字、数字、アンダースコアを使える
- 予約語は使えない
- PythonはUnicodeをサポートするため日本語も使えますが、一般には避けるのが無難です
例と可否一覧
名前の例 | 可否 | 理由 |
---|---|---|
name | 可 | 先頭が英字で有効 |
_temp | 可 | 先頭のアンダースコアは有効 |
age2 | 可 | 数字は先頭以外なら可 |
2nd | 不可 | 先頭が数字 |
user-name | 不可 | ハイフンは演算子として解釈される |
class | 不可 | 予約語 |
名前 | 可だが非推奨 | Unicodeは可。ただし共有やツールの互換性のためASCIIが無難 |
snake_caseと定数(UPPER_CASE)
PEP 8は、変数名にsnake_case
を推奨します。
定数はすべて大文字のUPPER_CASE
で表します。
Pythonには真の定数機構はありませんが、名前の付け方で「変更しない意図」を伝えます。
例
# 変数はsnake_caseで
max_speed = 80
user_count = 0
# 定数はUPPER_CASEで
MAX_RETRIES = 3
SERVER_URL = "https://example.com"
# 先頭アンダースコアは「内部用」の目印として使われます
_internal_cache = {}
理由
- 一貫したスタイルは読みやすさと検索のしやすさに直結します。
- 定数をUPPER_CASEにすると、設定値や変更すべきでない値がひと目でわかります。
予約語と避けたい組み込み名
予約語はPythonの文法で使われるキーワードで、変数名にはできません。
また、list
やstr
のような組み込み名を変数で上書きすると、標準の機能が使えなくなります。
予約語とは
# 予約語に含まれるかを確認する簡単な例
import keyword
print("class" in keyword.kwlist)
print("for" in keyword.kwlist)
print("lambda" in keyword.kwlist)
True
True
True
変数名に使えない予約語一覧 | |||
---|---|---|---|
False | await | else | import |
None | break | except | in |
True | class | finally | is |
and | continue | for | lambda |
as | def | from | nonlocal |
assert | del | global | not |
async | elif | if | or |
pass | raise | return | try |
while | with | yield |
変数名の大文字小文字は区別されるため、is
だとIs
、IS
を変数名にすることは可能ですが、基本的に使うことはおすすめしません。
これらの予約語を含む変数名が適切な場面では、is_converted
など、わかりやすい変数名にしましょう。
組み込み名を上書きするとどうなるか
# 組み込みのlistという型名を上書きしてしまう例
list = [1, 2, 3] # これは単なる変数代入。以降、listは「変数」になる
print(list)
# 本来のlist()コンストラクタを呼びたくても、もう呼べない
letters = list('abc') # ここでエラー
[1, 2, 3]
TypeError: 'list' object is not callable
上書きしてしまった場合は、その変数名をdel list
で削除するか、スクリプトを再実行して環境をリセットしてください。
最初からlst
など別名を使うと安全です。
ステップ4: 初心者がつまずく変数のエラーと対処
NameError(定義前の参照)
変数に値を代入する前に参照するとNameError
になります。
発生例
# まだtotalに値を入れていないのに参照している
print(total)
NameError: name 'total' is not defined
対処
# 先に値を代入してから使う
total = 0
print(total)
0
SyntaxError(無効な変数名・代入ミス)
文法に合わない変数名や記号を使うと、実行以前に構文エラーになります。
無効な変数名
# 先頭が数字
2nd = 1
SyntaxError: invalid decimal literal
# ハイフンは演算子として解釈される
user-name = "Alice"
SyntaxError: cannot assign to expression here. Maybe you meant '=='?
代入ミスの例
# === はPythonに存在しないため構文エラー
x === 1
SyntaxError: invalid syntax
# == は「比較」であって代入ではありません
x = 0
x == 1 # ここは比較しているだけ。結果は使われず、xの値は変わらない
print(x)
0
大文字小文字や上書きに注意
Pythonの名前は大文字小文字を区別します。
また、同じ名前に再代入すると以前の値は失われます。
大文字小文字の違い
age = 20
print(Age) # 変数名はage。Ageは別物として扱われる
NameError: name 'Age' is not defined
上書きの注意
# 同じ名前に別の型を入れると、後続の処理が想定外になることがあります
text = "hello"
text = 123 # ここで文字列から整数に置き換わる
print(text)
123
必要に応じて名前を変える、または用途ごとに別の変数名を用意すると安全です。
組み込み名の上書きは特に避けましょう(前述の例を参照)。
まとめ
変数は「値に名前を付ける」ための基本的な仕組みであり、Pythonでは動的型付けにより柔軟に扱えます。
代入は=
で行い、複数代入やアンパックを活用すると簡潔かつ読みやすいコードになります。
命名はPEP 8に従ってsnake_case
とUPPER_CASE
を使い分け、予約語や組み込み名の上書きを避けるのが実務的なコツです。
最後に、NameError
やSyntaxError
、大文字小文字の取り違え、意図しない上書きといった初歩的なミスは、定義の順序と命名の一貫性を意識することで多くを防げます。
まずはここで学んだ基礎を確実に身につけ、少しずつコード量を増やしながら慣れていきましょう。