default_factory
次のコードを実行したときの出力として、正しいものを1つ選べ。
from dataclasses import dataclass, field
@dataclass
class D:
xs: list = field(default_factory=list)
a, b = D(), D()
a.xs.append(1)
print(b.xs, a == b)
- A
[1] True - B
[] True - C
[1] False - D
[] False
正解と解説を見る
正解:D
データクラスで、リストなどのミュータブルなデフォルトを xs: list = [] と書くと、エラーになる。field(default_factory=list) で、インスタンスごとに作る。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `from dataclasses import dataclass, field` | — |
| 2 | `@dataclass` | — |
| 3 | `class D:` | — |
| 4 | └ `xs: list = field(default_factory=list)` | — |
| 5 | └ `@dataclass` | — |
| 6 | `@dataclass` | — |
| 7 | └ `xs: list = field(default_factory=list)` | — |
| 8 | └ `@dataclass` | — |
| 9 | `class D:` | — |
| 10 | `a, b = D(), D()` | a = D(vars={'xs': []}), b = D(vars={'xs': []}) |
| 11 | `a.xs.append(1)` | a = D(vars={'xs': [1]}) |
| 12 | `print(b.xs, a == b)` | b = D(vars={'xs': []}), a = D(vars={'xs': [1]}) |
| 結果 | 実際の出力 | [] False |
- A
誤り。リストは共有されない。
- B
誤り。
a.xsは[1]、b.xsは[]で、等しくない。 - C
誤り。
bのリストは空のまま。 - D
正しい。
default_factoryで、インスタンスごとに新しいリストが作られる。値が異なるので、==は偽。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。