クラス変数の共有
次のコードを実行したときの出力として、正しいものを1つ選べ。
class Dog:
tricks = []
def add_trick(self, trick):
self.tricks.append(trick)
d = Dog()
e = Dog()
d.add_trick("roll over")
e.add_trick("play dead")
print(d.tricks)
- A
['roll over'] - B
['roll over', 'play dead'] - C
['play dead'] - D
[]
正解と解説を見る
正解:B
クラス変数はすべてのインスタンスで共有され、インスタンス変数は __init__ などで self に設定する。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `class Dog:` | — |
| 2 | └ `tricks = []` | tricks = [] |
| 3 | └ `def add_trick(self, trick):` | — |
| 4 | `d = Dog()` | — |
| 5 | `e = Dog()` | — |
| 6 | `d.add_trick("roll over")` | — |
| 7 | └ `self.tricks.append(trick)` | trick = 'roll over' |
| 8 | `e.add_trick("play dead")` | — |
| 9 | └ `self.tricks.append(trick)` | trick = 'play dead' |
| 10 | `print(d.tricks)` | — |
| 結果 | 実際の出力 | ['roll over', 'play dead'] |
- A
誤り。tricks はクラス変数なので、すべてのインスタンスで共有される。
- B
正しい。クラスの本体で定義した tricks はクラス変数で、d と e が同じリストを使う。インスタンスごとに持たせたいときは、
__init__の中でself.tricks = []とする。 - C
誤り。d で追加した要素も残っている。
- D
誤り。要素は追加されている。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。