Pythonの「変数」は、数値や文字列などの「値」を一時的に保存し、後で再利用するための基本要素です。
この記事では、初心者の方がつまずきやすいポイントを避けながら、宣言と代入、データ型の基本、命名規則、型変換、スコープまでをサンプルコード付きで丁寧に解説します。
Pythonの変数の基本:数値・文字列の「値を入れる箱」を理解
変数とは何かと使いどころ
変数とは、プログラム中で値を扱いやすくするために名前を付けて保存する「ラベル」のようなものです。
たとえば、商品の価格やユーザー名、計算結果などに意味のある名前を与えることで、コードの可読性や再利用性が高まります。
変数を使うことで、同じ値を何度も記述する必要がなくなり、変更にも強いプログラムになります。
動的型付け言語Pythonにおける変数の特徴
Pythonは動的型付け言語です。
変数を宣言する際に型を明示する必要がなく、代入する値に応じて型が決まります。
また、同じ変数名に別の型の値を再代入することもできます。
これは柔軟で便利ですが、意図しない型の混在によるエラーを招く可能性があるため、型の確認や命名で意味を明確にすることが重要です。
変数の宣言と代入の書き方(サンプルコード付き)
代入演算子=と再代入の基本
Pythonでは=
で値を代入します。
宣言と代入が同時に行われ、再代入も自由です。
# 価格を表す変数に整数を代入
price = 1200
print(price) # 1200
# 再代入で値を更新
price = price + 300
print(price) # 1500
# 型を変えて再代入も可能(動的型付け)
price = "1500円"
print(price) # '1500円'
1200
1500
1500円
同時代入・アンパックで複数の値を設定
Pythonは複数代入(タプルアンパック)が簡潔に書けます。
入れ替えも一行で可能です。
# 同時代入
x, y, z = 1, 2, 3
print(x, y, z) # 1 2 3
# 値の入れ替え(テンポラリ変数不要)
a, b = 10, 20
a, b = b, a
print(a, b) # 20 10
# シーケンスのアンパック
data = [100, 200, 300]
first, second, third = data
print(first, second, third)
# アンパックでの残余(スター式)
head, *middle, tail = [1, 2, 3, 4, 5]
print(head, middle, tail)
1 2 3
20 10
100 200 300
1 [2, 3, 4] 5
type()で型を確認する方法
型が気になるときはtype()
で確認します。
n = 42 # int
pi = 3.14 # float
name = "Alice" # str
flag = True # bool
no_value = None # NoneType
print(type(n), type(pi), type(name), type(flag), type(no_value))
<class 'int'> <class 'float'> <class 'str'> <class 'bool'> <class 'NoneType'>
Pythonのデータ型の基本:int・float・str・bool・None
数値型(int/float)の使い方と四則演算
整数int
と浮動小数点数float
は、四則演算や剰余、冪乗が利用できます。
除算/
は常にfloat
、切り捨て除算//
は整数同士でint
になります。
a = 7
b = 3
print(a + b) # 加算
print(a - b) # 減算
print(a * b) # 乗算
print(a / b) # 除算(float)
print(a // b) # 切り捨て除算(int)
print(a % b) # 剰余
print(a ** b) # 冪乗
10
4
21
2.3333333333333335
2
1
343
浮動小数点の誤差
浮動小数点には丸め誤差があります。
必要に応じてdecimal
モジュールを検討します。
x = 0.1 + 0.2
print(x) # 丸め誤差の例
print(abs(x - 0.3) < 1e-9) # 許容誤差で比較
0.30000000000000004
True
文字列(str)の基本操作とエスケープ
文字列は'...'
または"..."
で囲みます。
改行やクォートはエスケープします。
複数行は"""..."""
が便利です。
s = "Hello, \"Python\"!" # ダブルクォートのエスケープ
t = 'It\'s fine.' # シングルクォートのエスケープ
u = """複数行の
テキストです。"""
print(s)
print(t)
print(u)
# 連結と繰り返し
greet = "Hi" + " " + "there"
line = "-" * 10
print(greet)
print(line)
# スライスと長さ
text = "abcdef"
print(text[0], text[-1], text[1:4])
print(len(text))
Hello, "Python"!
It's fine.
複数行の
テキストです。
Hi there
----------
a f bcd
6
真偽値(bool)とNoneの扱い
True
とFalse
は条件分岐で使います。
None
は「値がない」ことを表します。
is_empty = (len("") == 0)
print(is_empty) # True
value = None
if value is None:
print("値は未設定です")
# 真偽値コンテキストでの評価(空はFalse)
print(bool(0), bool(""), bool([]), bool(123), bool("text"))
True
値は未設定です
False False False True True
データ型ごとのサンプルコード
まとめとして、複数の型を扱う例を示します。
age = 20 # int
height = 1.73 # float
name = "Sato" # str
is_student = True # bool
nickname = None # NoneType
profile = f"{name}さんは{age}歳、身長{height}m、学生={is_student}"
print(profile)
print("ニックネーム未設定?", nickname is None)
Satoさんは20歳、身長1.73m、学生=True
ニックネーム未設定? True
変数名の付け方とベストプラクティス(PEP 8準拠)
有効な識別子と禁止事項(予約語・記号)
変数名は英字、数字、アンダースコアで構成し、数字から始めてはいけません。
ハイフンやスペースは使えません。
さらに、for
やclass
などの予約語は使用不可です。
予約語はkeyword
モジュールで確認できます。
import keyword
print("予約語の一部:", keyword.kwlist[:10]) # 最初の10件だけ表示
# 有効な例
user_name = "taro"
value2 = 10
# 無効な例(コメントとして記述)
# 2value = 10 # 先頭が数字はNG
# user-name = "x" # ハイフンはNG
# class = 1 # 予約語はNG
print(user_name, value2)
予約語の一部: ['False', 'None', 'True', 'and', 'as', 'assert', 'async', 'await', 'break', 'class']
taro 10
スネークケースで読みやすく命名する
PEP 8では、変数名は小文字とアンダースコアを用いるスネークケースが推奨されています。
意味が明確で、略語は控えめにします。
# 良い例
total_price = 1280
user_count = 42
# あまり良くない例(意味が曖昧 or 読みにくい)
tp = 1280
UserCount = 42 # これはクラス名のスタイル(CapWords)
定数の書き方(全大文字)と注意点
Pythonに言語仕様としての定数はありませんが、慣例として全大文字・アンダースコアで「変更しない意図」を示します。
実際には再代入できてしまうため、意図しない変更を避ける運用ルールが大切です。
PI = 3.14159
MAX_RETRY = 3
# 定数でも再代入は可能(避けるべき)
# PI = 3 # 実行はできるが、意味的にNG
print(PI, MAX_RETRY)
3.14159 3
型変換と文字列フォーマットの使い方
明示的な型変換(int, float, str)
ユーザー入力や外部データは文字列で来ることが多いため、明示的に変換します。
s = "42"
n = int(s) # '42' -> 42
f = float("3.5")
text = str(123)
print(n + 1, f * 2, text + "円")
43 7.0 123円
暗黙の型変換に注意するポイント
数値演算ではint + float
がfloat
になるなどの暗黙変換がありますが、文字列と数値の連結はエラーです。
bool
はint
のサブクラスである点にも注意します。
print(1 + 2.0) # 3.0 に昇格
# print("Age: " + 20) # TypeError: 文字列と数値は連結不可
print("Age: " + str(20))
# bool は int のサブクラス(True=1, False=0)
print(True + 2, False * 10)
3.0
Age: 20
3 0
f文字列・formatでの出力(サンプルコード)
可読性と性能の観点で、Python 3.6以降はf文字列が推奨されます。
桁区切りや小数点以下の桁数も指定できます。
name = "Yamada"
score = 98.765
count = 1234567
# f文字列
msg1 = f"{name}さんのスコアは{score:.2f}点(合計: {count:,})"
print(msg1)
# str.format
msg2 = "{0}さんのスコアは{1:.1f}点(合計: {2:,})".format(name, score, count)
print(msg2)
Yamadaさんのスコアは98.77点(合計: 1,234,567)
Yamadaさんのスコアは98.8点(合計: 1,234,567)
変数のスコープとライフタイムの基礎
ローカル変数とグローバル変数(global, nonlocal)
関数内で代入した変数はローカル変数になります。
モジュール直下の変数はグローバル変数です。
関数内からグローバルを更新するときはglobal
、ネストした関数で外側(ただしグローバルではない)の変数を更新するときはnonlocal
を使います。
x = 10 # グローバル
def use_local():
x = 99 # ローカル(グローバルとは別)
print("local x:", x)
def update_global():
global x
x = 42 # グローバルを書き換え
print("updated global x:", x)
def outer():
y = 0
def inner():
nonlocal y
y += 1 # 外側スコープの y を更新
return y
print(inner(), inner(), inner()) # 1 2 3
use_local()
print("global x before:", x)
update_global()
print("global x after:", x)
outer()
local x: 99
global x before: 10
updated global x: 42
global x after: 42
1 2 3
ミュータブルなオブジェクト参照時の注意点
リストや辞書などミュータブル(可変)なオブジェクトは、別名で同じ実体を参照していると、片方の変更がもう片方にも影響します。
コピーやデフォルト引数に注意します。
# 参照の共有による影響
a = [1, 2, 3]
b = a # 同じリストを参照
b.append(4)
print("a:", a, "b:", b) # a も更新される
# シャローコピーで独立させる
c = a.copy() # または list(a) / a[:] など
c.append(5)
print("a:", a, "c:", c)
# デフォルト引数の落とし穴
def append_item(x, items=None):
if items is None:
items = [] # 呼び出しごとに新しいリストを作る
items.append(x)
return items
print(append_item(1)) # [1]
print(append_item(2)) # [2] 独立している
# 悪い例(コメント):def bad_append(x, items=[]): ... # 使い回されるのでNG
a: [1, 2, 3, 4] b: [1, 2, 3, 4]
a: [1, 2, 3, 4] c: [1, 2, 3, 4, 5]
[1]
[2]
まとめ
本記事では、Pythonの変数を「値を入れる箱」として捉え、動的型付けの特性、代入とアンパック、主要なデータ型(int/float/str/bool/None)の基本操作、PEP 8に沿った命名、型変換と文字列フォーマット、さらにスコープとミュータブルな参照の注意点までを体系的に解説しました。
重要なのは、型を意識して読みやすい名前を付け、挙動が曖昧になりそうな箇所ではtype()
や明示的な型変換を使って意図を明確にすることです。
サンプルコードを実行しながら理解を深めることで、堅牢で読みやすいPythonコードが書けるようになります。