Pythonを学び始めると、「オブジェクトって何?」「==
と is
の違いは?」「可変と不変ってどう違うの?」といった疑問にぶつかることが多いですよね。
そこで今回は、Pythonのデータモデルの基本 をハンズオン形式で解説します! 実際にコードを書きながら、オブジェクト・値・型の概念をしっかり理解していきましょう。
🎯 このハンズオンの目標
- Pythonの オブジェクト とは何かを理解する
- 値 と 型 の違いを学ぶ
- 可変(mutable) と 不変(immutable) を体験する
==
(値の比較)とis
(オブジェクトの比較)の違いを知る- オブジェクトの寿命とガベージコレクション を理解する
それでは、さっそく始めましょう! 🚀
1️⃣ Pythonのオブジェクトとは?
Pythonでは、すべてのデータが「オブジェクト」 です。数値、文字列、リスト… すべてがオブジェクトとして扱われます。
🏋️♂️ ハンズオン 1: id()
を使ってオブジェクトを確認しよう
Pythonの各オブジェクトには、ID(メモリアドレス) が割り当てられています。
id()
を使うと、そのオブジェクトのIDを取得できます。
a = 10
b = 10
print(id(a)) # a のID
print(id(b)) # b のID
💡 質問:
a
とb
のIDは同じになるでしょうか?- Python は 小さな整数(-5 から 256)をキャッシュ するため、同じオブジェクトを参照する可能性があります。
2️⃣ 値と型
オブジェクトには、値(value) と 型(type) があります。
type()
を使うと、オブジェクトの型を確認できます。
🏋️♂️ ハンズオン 2: type()
を使って型を確認しよう
次のコードを実行してみましょう。
x = 42
y = 3.14
z = "Hello"
w = [1, 2, 3]
print(type(x)) # int(整数型)
print(type(y)) # float(浮動小数点型)
print(type(z)) # str(文字列型)
print(type(w)) # list(リスト型)
💡 質問:
x = 42.0
に変更すると、型はどう変わるでしょうか?
3️⃣ 可変(mutable)と不変(immutable)
Pythonのオブジェクトは、変更できるもの(可変) と 変更できないもの(不変) に分類されます。
型 | 可変性 |
---|---|
int |
❌ 不変 |
float |
❌ 不変 |
str |
❌ 不変 |
list |
✅ 可変 |
tuple |
❌ 不変 |
dict |
✅ 可変 |
🏋️♂️ ハンズオン 3: 不変オブジェクトと可変オブジェクトの違い
# リスト(可変)
numbers = [1, 2, 3]
print(id(numbers)) # 変更前のID
numbers.append(4)
print(numbers)
print(id(numbers)) # IDは変わらない(同じリストを変更)
# 文字列(不変)
text = "Hello"
print(id(text)) # 変更前のID
text += " World"
print(text)
print(id(text)) # IDが変わる(新しいオブジェクトが作られる)
💡 質問:
numbers.append(4)
ではid(numbers)
が変わらなかったのに、text += " World"
ではid(text)
が変わったのはなぜでしょう?
4️⃣ == と is の違い
Pythonでは、オブジェクトを比較する方法が2つ あります。
==
→ 値 が同じかどうかを比較is
→ ID(オブジェクトそのもの) が同じかどうかを比較
🏋️♂️ ハンズオン 4: ==
と is
の違い
a = [1, 2, 3]
b = [1, 2, 3]
c = a
print(a == b) # True(値が同じ)
print(a is b) # False(異なるオブジェクト)
print(a is c) # True(同じオブジェクト)
💡 質問:
b = [1, 2, 3]
の場合、a is b
がFalse
になる理由は?
5️⃣ オブジェクトの寿命とガベージコレクション
Pythonは ガベージコレクション(GC) を使って、不要になったオブジェクトを自動的に削除します。
オブジェクトの 参照カウント を sys.getrefcount()
で調べることができます。
🏋️♂️ ハンズオン 5: 参照カウントを確認しよう
import sys
x = [1, 2, 3]
print(sys.getrefcount(x)) # x の参照カウントを表示
y = x # x を y に代入(参照カウントが増える)
print(sys.getrefcount(x)) # 参照カウントが増えたか確認
💡 質問:
y = x
をするとsys.getrefcount(x)
はどう変わるでしょうか?
📌 まとめ
今回のハンズオンで学んだことを振り返りましょう!
✅ オブジェクト には id()
で一意の識別子がある
✅ type()
を使うとオブジェクトの型がわかる
✅ 可変(list
や dict
)と 不変(int
や str
)の違いを理解した
✅ ==
は 値の比較、is
は オブジェクトの比較 である
✅ ガベージコレクション の仕組みと参照カウントの概念を学んだ
Pythonを深く理解するには、データモデルの仕組み を知ることがとても重要です。
ぜひ、今回の内容を応用して クラスやカスタムオブジェクト についても学んでみてくださいね!
📌 次のステップ: クラスとオブジェクト指向プログラミングを学ぼう! 🚀