6.1.8リストを複製する
>>> data = ['鈴木', '田中', '井上', '加藤']
>>> data2 = data.copy()
>>> print(data2)
['鈴木', '田中', '井上', '加藤']
>>> print(data == data2)
True
>>> print(data is data2)
False
>>> 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に箇条書きにしてもらいした。
[0][0]はまず[1,2,3]の部分を数値で表すと0
[1,2,3]の1を数字で表すと0
になると認識しています。
print(data is data2)
では、data
とdata2
が全く同じオブジェクト(同じメモリ領域に存在する)かどうかを確認しています。これがFalse
を返す理由は、data
とdata2
が同じ内容を持つとはいえ、それぞれ異なる場所に存在する別々のオブジェクトであるからです。is
演算子はオブジェクト同一性を確認するため、data
とdata2
が異なるオブジェクトであることを示します。>>> 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に箇条書きにしてもらいした。
最初に
data
という名前のリストを作成します。このリストは他の3つのリストを含んでいます。それぞれのサブリストは3つの要素を含んでいます:[1, 2, 3]
,[4, 5, 6]
,[7, 8, 9]
。次に、
data.copy()
を使用してdata
リストのコピーを作成し、それをdata2
という新しい変数に代入します。ここで注意すべきは、copy()
関数は「浅い」コピーを作成するということです。つまり、元のリストの要素そのものはコピーせず、要素への参照(つまりアドレス)をコピーします。このため、元のリストのサブリスト([1, 2, 3]
,[4, 5, 6]
,[7, 8, 9]
)を変更すると、コピーも影響を受けます。次に、
data2[0][0] = 1000
を使用してdata2
の最初のサブリスト([1, 2, 3]
)の最初の要素を1000
に変更します。しかし、これはdata
リストにも影響を与えます。なぜなら、data2
はdata
の「浅い」コピーであり、サブリストへの参照は元のリストと同じであるからです。その結果、
data
とdata2
を出力した時、どちらも最初のサブリストの最初の要素が1000
に変更された同じリストが表示されます。
このような場合、リストの「深い」コピー(つまり要素自体を新たにコピーしたもの)を作りたい場合は、Pythonのcopy
モジュールのdeepcopy
関数を使用することが推奨されます。
[0][0]はまず[1,2,3]の部分を数値で表すと0
[1,2,3]の1を数字で表すと0
になると認識しています。
コメント