Vimスクリプト(その24)

前回は、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は再帰的にリストの値のコピーをしてくれるので、完全に別物になったようです。

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA