Python | 文法の基本:変数の基本

Python
スポンサーリンク

変数とは

変数は「値に名前をつけて、あとから参照したり差し替えたりできる仕組み」です。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)
Python

None と空の値

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)               # 戻り値で外側を更新
Python

global と nonlocal

どうしても関数内から外側の変数へ書き込みたい場合は globalnonlocal を使います。ただし可読性や保守性を下げやすいので、戻り値や引数で設計する方が安全です。

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では動的に型が決まります。代入は参照の張り替えであり、可変オブジェクトでは参照共有に注意が必要です。意味のある命名と定数の慣習、スコープの理解、そして型変換やコピーの使い分けを押さえると、予期せぬ挙動に振り回されずに、読みやすく安全なコードを書けます。

タイトルとURLをコピーしました