9

Python のリストがどのように機能するかを理解したと思ったとき...

>>> a = [1,2,3]
>>> b = a[:]
>>> b
[1,2,3]
>>> b[1]=100
>>> b
[1,100,3]
>>> a
[1,2,3]

ここまでは順調ですね。b が別のオブジェクトを指すように、a の内容で b を初期化しています。結果として、b の変更は a には影響しません。

次に、この別の例を見てみましょう。

>>> a = [[1,2,3],[4,5,6],[7,8,9]]
>>> b = a[:][:]
>>> b
[[1,2,3],[4,5,6],[7,8,9]]
>>> b[1][1] = 100
>>> b
[[1,2,3],[4,100,6],[7,8,9]]
>>> a
[[1,2,3],[4,100,6],[7,8,9]]

今度は b の変更が a に影響を与えたのはなぜですか? 前の例と何が違うの?

4

3 に答える 3

11

スライス操作x[:]により浅いコピーが作成されます。つまり、外側のリストは異なりますが、まったく同じ要素が含まれています。仮定a = [[1]]

b = a[:] # is the same as:
b = [x for x in a]

>>> a[0] is b[0]
True

二重スライス ( [:][:]) は、それ以上のことは何もしていません - 繰り返します:

b = a[:][:] # is the same as:
b = [y for y in [x for x in a]]

>>> a[0] is b[0]
True

浅いコピーの浅いコピーは、まあ、浅いコピーです。

これらのリストは異なるオブジェクトですが、同一の要素が含まれていますba次に、 の内側のリストを変更しますbが、 のリストは同じaです。

で2段のシャローコピーができますb=[x[:] for x in a]。n レベルのコピーについても同様に拡張されます。

ちなみに、「シャローコピー」という用語は、どのクラスやコンテナでも同じ意味です。

真のディープ コピーが必要な場合は、ディープ コピーの使用を検討する必要があります。

于 2013-06-13T20:23:45.117 に答える
4

silcing [:] は浅いコピーを作成します。ただし、内部オブジェクトはコピーされないままであるため、それらが変更可能であり、それらを変更すると変更されます;)両方のリストでこれが表示されます

リスト内包表記を使用する

b = [i[:] for i in a]

または copy.deepcopy()

import copy
b = copy.deepcopy(a)
于 2013-06-13T20:27:55.310 に答える