前回は、copyをつかってリストをコピーしましたが、実はリスト中のリストの実体はコピーされてません。
:let a=[1,[2,3]] :let b=copy(a) :let a[0]=100 :let a[1][0]=200 :echo a b
左がaで、右がbですが、a[1]とb[1]の値が同じになってますね。
リストのリストをコピーするには、deepcopyを使います。
:let a=[1,[2,3]] :let b=deepcopy(a) :let a[0]=100 :let a[1][0]=200 :echo a b
リストaとリストbは、これで別物になりました。
さらにリストの中にリストがある場合はどうでしょう。
:let a=[1,[2,[3]]] :let b=deepcopy(a) :let a[0]=100 :let a[1][0]=200 :let a[1][1][0]=300 :echo a b
deepcopyは再帰的にリストの値のコピーをしてくれるので、完全に別物になったようです。
コメント