問題
次のコードを実行した時の出力として正しいものは A 〜 D のどれでしょうか?

#Pythonクイズ
— Taklog (@taklog_info) September 29, 2023
No.12
次のコードを実行した時の出力として正しいものは A 〜 D のどれでしょうか? #Python #pythonprogramming pic.twitter.com/jOX7RxY8to
解答
正解は。。。
正解は C の
22
3です。
解説
今回は辞書の問題です。
今回の問題のポイントは1つです。
辞書のcopy()メソッド
辞書のcopy()メソッドは浅い(shallow)コピーにあたります。
浅いコピーを使って新しい変数を作る場合、一番大枠の辞書自体は別のオブジェクトとして作られますが、辞書の値にリスト・辞書がある場合、その値のリスト・辞書は同じオブジェクトになってしまいます。
今回の問題では辞書my_dict = {"one": [1], "two": [2], "three": [3]}にcopy()メソッドを使って辞書new_dictを作っています。
copy()メソッドが浅いコピーなので、my_dictとnew_dictは別のオブジェクトですが、my_dictの要素の値がリストであるため、浅いコピーで作ったnew_dictの要素の値は同じオブジェクトになっています。
つまり、my_dict["one"]とnew_dict["one"]、my_dict["two"]とnew_dict["two"]、my_dict["three"]とnew_dict["three"]が同じオブジェクトになります。
以上を踏まえて、問題を見ていきます。
まず、new_dict["four"] = [4]はmy_dictとnew_dictは別のオブジェクトなので、ここではnew_dictの方にだけ要素が追加されます。
次にnew_dict["two"][0] = 22はmy_dict["two"]とnew_dict["two"]は同じオブジェクトなので、new_dict["two"]に別の値を代入すると、同じオブジェクトであるmy_dict["two"]も同じ状態になります。
よって、my_dict["two"]は 22、len(my_dict)はmy_dictの要素数である3となります。
ちなみに、new_dictの方は要素を1つ追加しているので、len(new_dict)は4になります。
浅いコピーを避けたい場合は、copyモジュールのdeepcopy()関数を使います。
copyモジュールは Python の標準ライブラリーの1つです。

Google Colaboratory
下記リンクからアクセスして、Google Colaboratory 上で実際にコードを実行して、結果を確認していただけます。
おわりに
X で Python クイズを配信しています。
#Pythonクイズ
— Taklog (@taklog_info) September 29, 2023
No.12
次のコードを実行した時の出力として正しいものは A 〜 D のどれでしょうか? #Python #pythonprogramming pic.twitter.com/jOX7RxY8to
よかったらフォローしてください!
以上です。



コメント