変数とは
変数は「値に名前をつけて、あとから参照したり差し替えたりできる仕組み」です。Pythonでは型の宣言なしに、名前に値を代入するだけで使い始められます。変数はプログラムの途中結果や設定値、外部から受け取ったデータを一時的に保持するための基本的な道具です。
message = "こんにちは"
count = 3
price = 1980.5
is_member = True
Python代入と再代入の基本
右辺は評価され左辺は名前が結びつく
代入は「右辺を評価して、左辺の名前にそれを結びつける」動作です。数式の「=」と違い、プログラミングでは「値を入れる」という意味になります。右辺に式や関数呼び出しを書けば、その結果に名前をつけて再利用できます。
a = 10 + 5 # 右辺を評価し、a は 15 に結びつく
b = len("abc") # b は 3 に結びつく
Python代入は「上書き」ではなく参照の張り替え
Pythonの変数は「箱の中身を直接書き換える」よりも「ラベルを別の値へ付け替える」イメージです。同じ名前に別の値を代入すると、その名前が新しい値を指すようになります。
x = 100
x = "百" # x は整数ではなく文字列を指すように変わる(動的型付け)
Python動的型付けと型変換
型の確認と変換
Pythonは動的型付けなので、代入した値に応じて型が決まります。型を確認したいときは type() を使い、必要に応じて int(), float(), str() で変換します。文字列と数値を連結したい場合は、数値側を文字列に変換します。
age = "20"
print(type(age)) # <class 'str'>
age_num = int(age) # 数値へ変換
msg = "年齢は " + str(age_num) + " 歳です"
print(msg)
PythonNone と空の値
None は「値がないこと」を表す特別な値です。処理前の初期化や、失敗時の戻り値に使うと意図が伝わります。空文字 "" や空リスト [] とは意味が異なるので、区別して使い分けます。
result = None # まだ計算していない
text = "" # 空文字列(値はあるが中身が空)
items = [] # 空のリスト
Python命名規則と定数の慣習
使ってはいけない名前とわかりやすい命名
変数名は「英数字とアンダースコア」で作り、先頭は数字にできません。予約語(if, for, class など)や組み込み関数名(list, str, id など)を変数名にするのは避けましょう。読みやすさを優先し、意味のある名前にするのが基本です。
user_name = "太郎" # 良い例:意味が明確
l = [1, 2, 3] # あいまいな例:list の略で誤解を招きやすい
list = [1, 2, 3] # 悪い例:組み込みの list を上書きしてしまう
Python定数は言語機能では強制できませんが、慣習として「すべて大文字+アンダースコア」で書きます。変更しない意図が伝わります。
TAX_RATE = 0.1 # 定数の慣例
MAX_RETRY = 3
Python同時代入とアンパック代入
複数の値を一度に扱う
Pythonは同時に複数の変数へ代入できます。タプルやリストの形に並べ、左右の個数を合わせれば「アンパック」されます。入れ替え(swap)も一時変数なしで書けます。
name, age = "花子", 20
x, y = 10, 20
x, y = y, x # x=20, y=10 に入れ替わる
Python例外と安全なアンパック
個数が合わないと ValueError になります。可変長の受け取りが必要なら、*rest を使うと安全に受け止められます。
a, b, *rest = [1, 2, 3, 4] # a=1, b=2, rest=[3, 4]
Python可変と不変、コピーの落とし穴
参照共有で起きる意図しない連動
リストや辞書は「可変(ミュータブル)」、文字列やタプルは「不変(イミュータブル)」です。可変オブジェクトの変数を別名に代入すると「同じものを指す」ため、一方の変更が他方にも反映されます。独立させたいならコピーが必要です。
a = [1, 2]
b = a # 同じリストを参照
b.append(3)
print(a) # [1, 2, 3] も変わる
Pythonシャローコピーとディープコピー
浅いコピー(shallow copy)は「一段目だけ」複製します。入れ子構造がある場合は中の参照は共有されたままです。完全に独立させたいなら copy.deepcopy() を使います。
import copy
data = [[1], [2]]
shallow = data.copy() # または list(data)
deep = copy.deepcopy(data)
shallow[0].append(99)
print(data) # [[1, 99], [2]] に影響(浅いコピーの限界)
deep[1].append(88)
print(data) # deep の変更は data に影響しない
Pythonスコープの基本(ローカルとグローバル)
関数内の名前はローカルになる
関数内で代入した名前は、その関数のローカルスコープに属します。同じ名前が外側にもあっても、基本的には内側が優先されます。関数の外で共有したい値は「戻り値として返す」のが安全です。
total = 0
def add(x):
local_total = x # 関数内の変数(ローカル)
return local_total
total = add(5) # 戻り値で外側を更新
Pythonglobal と nonlocal
どうしても関数内から外側の変数へ書き込みたい場合は global や nonlocal を使います。ただし可読性や保守性を下げやすいので、戻り値や引数で設計する方が安全です。
counter = 0
def inc():
global counter
counter += 1
Python実践例題
例題1:ユーザー入力を変数で扱う
入力は文字列なので、数値として使うには型変換が必要です。変数を介して意味のある名前で扱うと、コードの意図が伝わります。
age_text = input("年齢を入力してください: ") # 文字列
age = int(age_text) # 数値へ変換
is_adult = age >= 18
print(f"成人判定: {is_adult}")
Python例題2:集計用の作業変数
ループで合計を更新する「作業変数」は、初期値と更新の順序が肝心です。+= は加算代入の省略記法で、読みやすさが上がります。
prices = [120, 340, 560]
total = 0
for p in prices:
total += p # total = total + p
print(f"合計金額: {total}")
Python例題3:設定値と定数の使い分け
変更しない想定の値は定数の慣習で表し、変更されうる値は通常の変数で管理します。意図の違いが読み手に伝わります。
TAX_RATE = 0.1 # 変えない前提の設定
amount = 1000 # 入力に応じて変わる値
final = amount + round(amount * TAX_RATE)
print(final)
Python例題4:参照とコピーの違いを体験
同じリストを指すと変更が連動します。独立させたいときはコピーにすることで直感的な挙動になります。
scores = [80, 90]
alias = scores # 参照共有
copy_scores = scores[:] # 浅いコピー(スライス)
alias.append(100)
print(scores) # [80, 90, 100] に連動
copy_scores.append(70)
print(scores) # 元の scores は変わらない
Pythonまとめ
変数は「名前と値の結びつき」で、Pythonでは動的に型が決まります。代入は参照の張り替えであり、可変オブジェクトでは参照共有に注意が必要です。意味のある命名と定数の慣習、スコープの理解、そして型変換やコピーの使い分けを押さえると、予期せぬ挙動に振り回されずに、読みやすく安全なコードを書けます。
