変数と定数についてこの記事で詳しく解説する。プログラミング初心者がつまづきやすいメモリ管理の仕組みや、実際の開発現場で使われるベストプラクティスまで書きたい。
変数の基本概念とメモリ管理
変数とは、プログラム内で値を一時的に保持し、必要に応じて参照や変更を可能にする仕組みだ。Pythonでは、変数を宣言するだけで自動的にメモリ(RAM)上にデータが格納される。
変数の宣言と代入
Pythonの変数宣言はシンプルだ。型を明示的に指定する必要がなく、値を代入するだけで変数が作成される。
# 基本的な変数の宣言
x = 5 # 整数型の変数
y = "Hello" # 文字列型の変数
z = 3.14 # 浮動小数点数型の変数
is_active = True # 真偽値型の変数
# 変数の値を変更
x = 10 # xの値を5から10に変更
y = "Python" # yの値を"Hello"から"Python"に変更
print(f"x = {x}, y = {y}") # x = 10, y = Python
Pythonのメモリ管理の仕組み
Pythonでは、変数が実際にどのようにメモリで管理されているかを理解することが重要だ。
変数はオブジェクトへの参照を保持している。
# メモリ上でのオブジェクト管理
a = 42
b = 42 # 同じ値を代入
print(id(a)) # 例: 140735567206496
print(id(b)) # 例: 140735567206496(同じID)
# 新しい値を代入すると新しいオブジェクトが作成される
a = 43
print(id(a)) # 例: 140735567206528(異なるID)
# 文字列の場合
message1 = "Python"
message2 = "Python"
print(id(message1) == id(message2)) # True(同じオブジェクトを参照)
この仕組みにより、Pythonは効率的にメモリを使用している。
同じ値を持つ変数は、可能な限り同一のオブジェクトを参照するのだ。

上の図では、Pythonのメモリ管理の状態を表現している。xに5が入れられると二つの領域がメモリ上に割り当てられる。名前空間上のxと値の5だ。xを6に変更すると名前空間上のxの位置はかわらないが、xの指し先が別の6の値が入った領域になる。

【Udemy】Python入門講座(0からPythonの基礎を体系的に学んで、生成AIでバイブコーディング)
受講生3000人ほどの人気講座。Pythonの基礎から生成AI活用までを20時間ほどで一気に学びます。業務で活かせるPythonの基礎知識はしっかりと身につきます。
定数の概念と命名規則
定数とは変更ができない値のことだが、Pythonには言語レベルでの明示的な定数宣言機能がない。しかし、命名規則で定数として扱う変数を定義するのが一般的だ。
定数の命名規則
Pythonでは、定数は大文字とアンダースコアで命名するのが慣習だ。
# 定数の定義例
PI = 3.14159
MAX_CONNECTIONS = 100
DATABASE_URL = "postgresql://user:password@localhost/dbname"
API_KEY = "your_secret_api_key_here"
DEFAULT_TIMEOUT = 30
# 設定値として使用
def calculate_circle_area(radius):
return PI * radius * radius
def connect_to_database():
# DATABASE_URLを使用して接続
print(f"データベースに接続中: {DATABASE_URL}")
定数使用時の注意点
Pythonでは技術的には定数の値を変更できてしまうため、開発チーム内での規約が重要になる。
# 定数として定義
MAX_RETRY_COUNT = 3
# 技術的には変更可能(ただし推奨されない)
MAX_RETRY_COUNT = 5 # これは避けるべき
# 適切な使用例
def send_request_with_retry(url, data):
for attempt in range(MAX_RETRY_COUNT):
try:
# リクエスト処理
response = send_request(url, data)
return response
except Exception as e:
if attempt == MAX_RETRY_COUNT - 1:
raise e
print(f"リトライ {attempt + 1}/{MAX_RETRY_COUNT}")
変数の命名規則とベストプラクティス
Pythonでは、PEP 8(Python Enhancement Proposal 8)という公式スタイルガイドに従って変数名を付けることが推奨される。
# 良い変数名の例
user_name = "田中太郎"
total_price = 15800
is_valid_email = True
max_retry_count = 3
# 避けるべき変数名の例
# x = "田中太郎" # 意味が不明確
# totalPrice = 15800 # キャメルケース(Pythonでは非推奨)
# validEmail = True # キャメルケース(Pythonでは非推奨)
# 数値計算の例
item_price = 1000
tax_rate = 0.1
discount_rate = 0.05
# 計算結果をわかりやすい変数名で格納
subtotal = item_price * (1 - discount_rate)
tax_amount = subtotal * tax_rate
final_price = subtotal + tax_amount
print(f"商品価格: {item_price}円")
print(f"割引後価格: {subtotal}円")
print(f"税額: {tax_amount}円")
print(f"最終価格: {final_price}円")

【Udemy】Python入門講座(0からPythonの基礎を体系的に学んで、生成AIでバイブコーディング)
受講生3000人ほどの人気講座。Pythonの基礎から生成AI活用までを20時間ほどで一気に学びます。業務で活かせるPythonの基礎知識はしっかりと身につきます。
実践的な変数・定数活用例
実際の開発現場でよく使われるパターンを紹介しよう。設定管理と計算処理を組み合わせた実用的な例だ。
# 設定定数の定義
DEFAULT_LANGUAGE = "ja"
MAX_LOGIN_ATTEMPTS = 5
SESSION_TIMEOUT_MINUTES = 30
ERROR_MESSAGES = {
"invalid_login": "ログイン情報が正しくありません",
"account_locked": "アカウントがロックされました",
"session_expired": "セッションが期限切れです"
}
# アプリケーションの状態を管理する変数
current_user = None
login_attempts = 0
session_start_time = None
def authenticate_user(username, password):
global current_user, login_attempts, session_start_time
# ログイン試行回数のチェック
if login_attempts >= MAX_LOGIN_ATTEMPTS:
return False, ERROR_MESSAGES["account_locked"]
# 認証処理(簡略化)
if username == "admin" and password == "secret":
current_user = username
login_attempts = 0 # 成功時にリセット
session_start_time = time.time()
return True, "ログイン成功"
else:
login_attempts += 1
remaining_attempts = MAX_LOGIN_ATTEMPTS - login_attempts
return False, f"{ERROR_MESSAGES['invalid_login']} (残り{remaining_attempts}回)"
def check_session_validity():
import time
if current_user is None:
return False, "ログインしていません"
if session_start_time is None:
return False, "セッション情報が見つかりません"
elapsed_minutes = (time.time() - session_start_time) / 60
if elapsed_minutes > SESSION_TIMEOUT_MINUTES:
return False, ERROR_MESSAGES["session_expired"]
return True, "セッション有効"
# 使用例
print("=== ユーザー認証システム ===")
result, message = authenticate_user("admin", "wrong_password")
print(f"認証結果: {message}")
result, message = authenticate_user("admin", "secret")
print(f"認証結果: {message}")
if result:
session_valid, session_message = check_session_validity()
print(f"セッション状態: {session_message}")