6.1.8リストを複製する


>>> data = ['鈴木', '田中', '井上', '加藤']
>>> data2 = data.copy()
>>> print(data2)
['鈴木', '田中', '井上', '加藤']
>>> print(data == data2)
True
>>> print(data is data2)
False

print(data is data2)では、datadata2が全く同じオブジェクト(同じメモリ領域に存在する)かどうかを確認しています。これがFalseを返す理由は、datadata2が同じ内容を持つとはいえ、それぞれ異なる場所に存在する別々のオブジェクトであるからです。is演算子はオブジェクト同一性を確認するため、datadata2が異なるオブジェクトであることを示します。

>>> data = [ ... [1, 2, 3], ... [4, 5, 6], ... [7, 8, 9], ... ] >>> data2 = data.copy() >>> data2[0][0] = 1000 >>> print(data) [[1000, 2, 3], [4, 5, 6], [7, 8, 9]] >>> print(data2) [[1000, 2, 3], [4, 5, 6], [7, 8, 9]]

難しいのGPTに箇条書きにしてもらいした。

  1. 最初に data という名前のリストを作成します。このリストは他の3つのリストを含んでいます。それぞれのサブリストは3つの要素を含んでいます: [1, 2, 3], [4, 5, 6], [7, 8, 9]

  2. 次に、data.copy()を使用してdataリストのコピーを作成し、それをdata2という新しい変数に代入します。ここで注意すべきは、copy()関数は「浅い」コピーを作成するということです。つまり、元のリストの要素そのものはコピーせず、要素への参照(つまりアドレス)をコピーします。このため、元のリストのサブリスト([1, 2, 3], [4, 5, 6], [7, 8, 9])を変更すると、コピーも影響を受けます。

  3. 次に、data2[0][0] = 1000を使用してdata2の最初のサブリスト([1, 2, 3])の最初の要素を1000に変更します。しかし、これはdataリストにも影響を与えます。なぜなら、data2dataの「浅い」コピーであり、サブリストへの参照は元のリストと同じであるからです。

  4. その結果、datadata2を出力した時、どちらも最初のサブリストの最初の要素が1000に変更された同じリストが表示されます。

このような場合、リストの「深い」コピー(つまり要素自体を新たにコピーしたもの)を作りたい場合は、Pythonのcopyモジュールのdeepcopy関数を使用することが推奨されます。


[0][0]はまず[1,2,3]の部分を数値で表すと0

[1,2,3]の1を数字で表すと0

になると認識しています。