Pythonの浅いコピーの深いコピー

1586 ワード

深いコピー:a->b copy(a)a->c content(b)=content(c)&&id(b)!=id(c)
浅いコピー:a->b copy(a)a->b
 
すなわち、深いコピーは新しいオブジェクトのために独立した新しいコピーを作成し、論理は関係なく、内容が同じであり、浅いコピーは簡単なコピー参照関係にすぎない.
参照時に変更できないポインタで、ポインタは変更可能な参照です.
 
 
person = ['name',['Saving',100.0]]
hubby = person[:]
#wife = list[person]
print 'before',
print person , hubby
print [id(x) for x in person]
print [id(x) for x in hubby]
print '====================================='
hubby[0] = 'joe'
hubby[1][1] = 50
print 'after',
print person , hubby
print [id(x) for x in person]
print [id(x) for x in hubby]

実行結果:
 
before ['name', ['Saving', 100.0]] ['name', ['Saving', 100.0]]
[4965536, 38955528]
[4965536, 38955528]
=====================================
after ['name', ['Saving', 50]] ['joe', ['Saving', 50]]
[4965536, 38955528]
[39020160, 38955528]
驚いたことに、hubbyの変化はpersonの変化をもたらさず、リストは変化した.どうして?
Stringは可変オブジェクトであるため、コピー時に新しい変数(赤で示す)が作成され、listは変更可能オブジェクトであり、直接コピー参照(浅いコピー)がコピーされます.
hubby=copyを使用する場合.deepcopy(person)は、深いコピーになります.
 
1.非コンテナタイプ(数値、文字列、その他の「原子」タイプのオブジェクト、コード、タイプ、xrangeオブジェクトなど)はコピーされていません.
2.メタグループ変数に原子型オブジェクトのみが含まれている場合、その深いコピーは行われず、深いコピーでも浅いコピーは1つしか得られません.
3.浅いコピーは完全スライス操作で行う