-
直接代入:実際にはオブジェクトの参照(エイリアス)です。
-
浅いコピー(copy):親オブジェクトをコピーしますが、オブジェクト内部の子オブジェクトはコピーしません。
-
ディープコピー(deepcopy):copy モジュールの deepcopy メソッドは、親オブジェクトとその子オブジェクトを完全にコピーします。
辞書の浅いコピーの例
例
>>>a = {1: [1,2,3]}
>>> b = a.copy()
>>> a, b
({1: [1, 2, 3]}, {1: [1, 2, 3]})
>>> a[1].append(4)
>>> a, b
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
ディープコピーには copy モジュールのインポートが必要です:
例
>>>import copy
>>> c = copy.deepcopy(a)
>>> a, c
({1: [1, 2, 3, 4]}, {1: [1, 2, 3, 4]})
>>> a[1].append(5)
>>> a, c
({1: [1, 2, 3, 4, 5]}, {1: [1, 2, 3, 4]})
解析
1、b = a: 代入参照では、a と b は同じオブジェクトを指します。

2、b = a.copy():浅いコピーでは、a と b は独立したオブジェクトですが、それらの子オブジェクトは同じオブジェクトを指しています(参照です)。

b = copy.deepcopy(a):ディープコピーでは、a と b は親オブジェクトとその子オブジェクトを完全にコピーしており、両者は完全に独立しています。

その他の例
以下の例は、copy モジュールの copy.copy(浅いコピー)と copy.deepcopy(ディープコピー)を使用しています:
例
#!/usr/bin/python
# -*-coding:utf-8 -*-
import copy
a = [1, 2, 3, 4, ['a', 'b']] #元のオブジェクト
b = a #代入、オブジェクトの参照を渡す
c = copy.copy(a) #オブジェクトのコピー、浅いコピー
d = copy.deepcopy(a) #オブジェクトのコピー、ディープコピー
a.append(5) #オブジェクトaを変更
a[4].append('c') #オブジェクトa内の['a', 'b']配列オブジェクトを変更
print( 'a = ', a )
print( 'b = ', b )
print( 'c = ', c )
print( 'd = ', d )
上記の例を実行した出力結果は次のとおりです:
('a = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('b = ', [1, 2, 3, 4, ['a', 'b', 'c'], 5])
('c = ', [1, 2, 3, 4, ['a', 'b', 'c']])
('d = ', [1, 2, 3, 4, ['a', 'b']])