【python】スライス操作をすると、新しいオブジェクトが作られる。
ミュータブル(変更可能)なオブジェクトを関数に渡すと、それは通常参照渡しになるので、関数の中で内容を書き換えた場合は、呼び出し元のオブジェクトも同時に変更が加わる。
しかし途中でスライス操作をすると、スライス操作自体が新しいオブジェクトを生成するので、呼び出し元のオブジェクトに変更が残らない。
これは関数の中だけで変更を閉じたいときには楽でいいが、関数の中で内容を書き替えることを想定していた場合は思った動作をしないわけで、ちょっとややこしい。
下記、適当に書いて試したコード。多分numpyとかも転置とかスライスやると新しいオブジェクトができるのだろう。
C言語のときもそうだったけれど、ふと気づいたことを実際に書いて動かしてみるというのは大事。最初のころはこういうことに気づくこともできない。
pythonでオブジェクトのIDを調べるには"id(a)"と書けばいい。C言語でアドレスが同じになってるか違うのかを調べるときにやっていた手法とよく似ている。
def edit(a):
a[0] = 12
def do_slice(t):
a = t[:2]
print(f"at do_slice: {a}") #スライスした時点で別オブジェクトなので元のaには影響しない
b = a
b[1] = 30
print(f"at do_slice: {b}")
print(f"{a},{b}")
a = [0,1,2]
print(f"{id(a)}")
edit(a)
print(a)
do_slice(a)
print(a)
« 【エディタ】vimのコマンドモードが便利すぎた件 入門して少し使えるようになったら早めにヘルプドキュメントを読もう | トップページ | 【python】 numpy ちょっと癖あるshape »
「Python」カテゴリの記事
- 【python】 unittestを使う ユニットテストの練習(2022.10.19)
- 【python】 pillowでフォントを使うときにちょっとてこずった。windows環境下(2022.09.28)
- 【python】spyderでanacondaの仮想環境を使う(2022.09.21)
- 【python】Spyderをpyenvで使う(2022.09.14)
- 【python】 numpy ちょっと癖あるshape(2022.09.07)
« 【エディタ】vimのコマンドモードが便利すぎた件 入門して少し使えるようになったら早めにヘルプドキュメントを読もう | トップページ | 【python】 numpy ちょっと癖あるshape »
コメント