私はpythonで浅いコピーで遊んでいます。予想もしていなかった落とし穴に出くわしました。
私の仮定では、浅いコピーは、クラス内のオブジェクトへの参照を持つクラスの新しいインスタンスであるというものでした。この動作を以下に示します。
>>> a = { 'a': 1, 'b':2, 'c': [[1,2],2,3,4,5,6] }
>>> c = copy.copy(a['c'])
>>> d = a['c']
>>> a['c'] is c
False
>>> a['c'][0] is c[0]
True
>>> a['c'] is d
True
>>> a['c'][0] is d[0]
True
驚いたのは以下。浅いコピーされたリストの要素はリスト内の要素への参照であるため、a
変更可能な最初の要素を変更すると、a
.
>>> c[0] = [3,3]
>>> c
[[3, 3], 2, 3, 4, 5, 6]
>>> a
{'a': 1, 'c': [[1, 2], 2, 3, 4, 5, 6], 'b': 2}
>>> a['c'][0] is c[0]
False
変更後、最初の要素が の参照ではなくなったことがわかりましたa
。
私の質問:
リスト内のすべての要素を変更すると、ディープコピーに似たものになりますか?