問題
次のコードを実行した時の出力として正しいものは 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
よかったらフォローしてください!
以上です。
コメント