Python 3 エンジニア認定基礎試験 無料問題 4 / 10 ・ 分野4: 4章 制御構造ツール
反復しているコレクションをその反復の中で書き換えるコードは理解しにくいとして、4.2 が代わりに示している2つの書き方の組み合わせはどれか。
- コピーを反復して元のコレクションから取り除く書き方と、条件に合う要素だけで新しいコレクションを作る書き方
- 元を反復してコピーから取り除く書き方と、条件に合う要素だけで新しいコレクションを作る書き方
- コピーを反復して元のコレクションから取り除く書き方と、取り除く要素を控えて反復のあとで取り除く書き方
- 元を反復してコピーから取り除く書き方と、取り除く要素を控えて反復のあとで取り除く書き方
正解と解説を見る
正解: A
正解の理由
チュートリアルは、コレクションオブジェクトの値を反復処理しているときに、そのコレクションオブジェクトを変更するコードは理解するのが面倒になり得る、と注意している。そのうえで、コピーに対して反復処理をするか、新しいコレクションオブジェクトを作成する方が通常は理解しやすい、と述べ、2つの例を示している。1つ目は users.copy().items() を反復し、status が 'inactive' のものを元の users から del で取り除く。2つ目は users.items() を反復し、status が 'active' のものだけを空の辞書 active_users に入れる。
違う選択肢
「元を反復してコピーから取り除く書き方と、条件に合う要素だけで新しいコレクションを作る書き方」… 2つ目は合っているが、1つ目の向きが逆である。例で反復しているのは users.copy() で、del で取り除いているのは元の users である。取り除いた結果を元のコレクションに残すために、コピーの側を反復に使っている。
「コピーを反復して元のコレクションから取り除く書き方と、取り除く要素を控えて反復のあとで取り除く書き方」… 1つ目は合っているが、2つ目が違う。4.2 のもう1つの書き方は、条件に合う要素だけを新しいコレクションに入れるもので、元のコレクションには手を付けない。取り除く要素を控えておき、反復のあとでまとめて取り除く書き方は、4.2 には示されていない。
「元を反復してコピーから取り除く書き方と、取り除く要素を控えて反復のあとで取り除く書き方」… 1つ目は反復する側と取り除く側が逆で、2つ目は 4.2 に示されていない書き方である。4.2 の2つは、コピーを反復して元から取り除く書き方と、新しいコレクションを作る書き方である。
2つの書き方の違い
コピーを反復する方法は元のコレクションそのものを書き換えるので、ほかの場所から同じオブジェクトを参照していれば、その参照先にも変更が見える。新しいコレクションを作る方法は元を残したまま別のオブジェクトを作る。目的に合わせて選ぶ。