Pythonのスコープは初心者にとって、時にややこしく感じるかもしれません。特にインスタンスや変数のスコープに関しては、思わぬ落とし穴が待っていることも…。この記事では、スコープに関するクイズを解きながら、しっかりとその仕組みを理解していきましょう。難易度はだんだん上がるので、最後までチャレンジしてみてください!
クイズ1: ローカルスコープとグローバルスコープの違い
Python初心者が最初にぶつかる壁は、ローカルスコープとグローバルスコープの違いです。さっそくこの簡単なクイズから始めましょう!
x = 10
def f():
x = 5
f()
print(x)
答え: 10
解説: 関数f()
内のx
はローカル変数であり、グローバルなx
には影響を与えません。
クイズ2: インスタンス変数とメソッド内のローカル変数
オブジェクト指向の考え方に触れたばかりの頃は、インスタンス変数とメソッド内のローカル変数の違いに戸惑うことがあります。このクイズで理解を深めましょう。
class MyClass:
def __init__(self):
self.x = 10
def update(self):
x = 5
obj = MyClass()
obj.update()
print(obj.x)
答え: 10
解説: メソッドupdate
内のx
はローカル変数であり、インスタンス変数self.x
には影響を与えません。
クイズ3: インスタンスを引数として渡した場合のスコープ
次に、インスタンスを関数に渡したときの動作を理解してみましょう。インスタンスの属性がどのように扱われるかに注目してください。
class MyClass:
def __init__(self, x):
self.x = x
def modify(obj):
obj.x += 10
obj = MyClass(5)
modify(obj)
print(obj.x)
答え: 15
解説: 関数modify
に渡されたobj
は、MyClass
インスタンスへの参照です。そのため、modify
内でobj.x
を変更すると、元のインスタンスも更新されます。
クイズ4: インスタンス変数とローカル変数の混同
メソッド内でインスタンス変数とローカル変数が混在する場合、どのように処理されるかを理解してみましょう。
class MyClass:
def __init__(self):
self.x = 10
def update(self, x):
x += 5
self.x = x
obj = MyClass()
obj.update(3)
print(obj.x)
答え: 8
解説: メソッドupdate
の引数x
はローカル変数ですが、最後にself.x
にその結果を代入しているため、obj.x
が更新されます。
クイズ5: クラス内でのスコープの重複
クラス変数とインスタンス変数が同じ名前を持つと、どうなるのでしょうか?このクイズでその挙動を確かめてみましょう。
class MyClass:
x = 10
def __init__(self, x):
self.x = x + 5
def print_values(self):
print(self.x)
print(MyClass.x)
obj = MyClass(3)
obj.print_values()
答え: 8
と10
解説: self.x
はインスタンス変数であり、MyClass.x
はクラス変数です。print_values
メソッドでは、self.x
(インスタンス変数)とMyClass.x
(クラス変数)をそれぞれ出力しています。
クイズ6: 複数のインスタンスとクラス変数
最後のクイズは、複数のインスタンスが同じクラス変数を共有する場合の挙動を確認するものです。どのような結果が得られるか、考えてみてください。
class MyClass:
shared = []
def __init__(self, x):
self.x = x
MyClass.shared.append(x)
obj1 = MyClass(1)
obj2 = MyClass(2)
print(obj1.shared)
print(obj2.shared)
答え: [1, 2]
と[1, 2]
解説: shared
はクラス変数であり、全てのインスタンス間で共有されます。そのため、obj1
とobj2
の両方が同じリストを操作します。
これで、Pythonにおけるスコープの基本と、やや複雑なケースについてしっかり理解できたのではないでしょうか?ぜひ、バグの少ないコードを書いていきましょう!
コメント