ホームページ制作を大阪で安く頼むならプロットハブ!

ホームページ制作を大阪で安く頼むならプロットハブ!
毎月5社限定企画実施中

プロットハブ技術ブログ

Pythonのスコープをマスターしよう!初学者がひっかかりやすいクイズ6選

Kei Setoguchi

Kei Setoguchi

2024/8/25

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()

答え: 810
解説: 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はクラス変数であり、全てのインスタンス間で共有されます。そのため、obj1obj2の両方が同じリストを操作します。


これで、Pythonにおけるスコープの基本と、やや複雑なケースについてしっかり理解できたのではないでしょうか?ぜひ、バグの少ないコードを書いていきましょう!

プロットハブはソフトウェア開発を
支援しています。
ご興味のある方はぜひお気軽に
ご相談ください。

一覧ページに戻る

全カテゴリ一覧

全タグ一覧

関連記事

コメント

コメントを残す

コメントが承認されると公開されます。※の入力欄は必須項目です

ホームページ制作が毎月5社限定5万5千円から!ご依頼の方はコチラ!