1. ホーム
  2. パイソン

[解決済み】リストをディープコピーする方法?

2022-04-07 05:15:33

質問

E0_copy = list(E0) と思います。 E0_copy のディープコピーです。 E0 から id(E0) が等しくない id(E0_copy) . そして、次のように修正します。 E0_copy をループに入れるのですが、なぜか E0 になってからでは?

E0 = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for k in range(3):
    E0_copy = list(E0)
    E0_copy[k][k] = 0
    #print(E0_copy)
print E0  # -> [[0, 2, 3], [4, 0, 6], [7, 8, 0]]

どのように解決するのですか?

E0_copy を使用してディープコピーを作成することはできません。 list() . (共に list(...)testList[:] は浅いコピーです)。

あなたが使うのは copy.deepcopy(...) は、リストのディープコピーに使用します。

deepcopy(x, memo=None, _nil=[])
    Deep copy operation on arbitrary Python objects.

次のスニペットを参照してください。

>>> a = [[1, 2, 3], [4, 5, 6]]
>>> b = list(a)
>>> a
[[1, 2, 3], [4, 5, 6]]
>>> b
[[1, 2, 3], [4, 5, 6]]
>>> a[0][1] = 10
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b   # b changes too -> Not a deepcopy.
[[1, 10, 3], [4, 5, 6]]

ここで deepcopy 操作

>>> import copy
>>> b = copy.deepcopy(a)
>>> a
[[1, 10, 3], [4, 5, 6]]
>>> b
[[1, 10, 3], [4, 5, 6]]
>>> a[0][1] = 9
>>> a
[[1, 9, 3], [4, 5, 6]]
>>> b    # b doesn't change -> Deep Copy
[[1, 10, 3], [4, 5, 6]]

説明すること。 list(...) は、内部のオブジェクトのコピーを再帰的に作成しません。一番外側のリストのコピーを作成するだけで、同じ内側のリストを参照します。したがって、内側のリストを変更すると、元のリストと浅いコピーの両方に変更が反映されます。シャローコピーが内部リストを参照していることは id(a[0]) == id(b[0]) ここで b = list(a) .