python : copy() & deepcopy()

1597 ワード

高度な言語では、変数はメモリとそのアドレスの抽象です.pythonの場合、pythonのすべての変数はオブジェクトであり、変数の格納は、意味を参照する方法を採用しており、格納されているのは変数の値が存在するメモリアドレスだけであり、この変数自体ではない.
     1.copy()浅いコピー:どんなに複雑なデータ構造でも、浅いコピーはcopyの1層しかできません.
       
>>> import copy
>>> c=copy.copy(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]

>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']]           

    2.deepcopy()深さコピー:pythonのcopyモジュールが提供する別のdeepcopyメソッド.深いコピーは元の変数に関連するすべてのデータを完全にコピーし、メモリに完全に同じ内容を生成します.この過程で、この2つの変数のうちの1つを任意に変更しても、他の変数には影響しません.
     
 import copy

>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]

  3.直接付与、オブジェクトの参照を渡すだけで、元のリストが変更され、付与されたbも同じ変更を行います.
       
>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]