結果を保存しなければいけないメソッドとそうでないものの違いについての質問

なぜappend()は replace()のように結果を代入しなくても良いのか。

このメソッドを作った人(たち)がその方が便利/理に叶うと考えたからです。

結果を代入しなければ結果が変わらないメソッドは、これ以外に何があるか。

たくさんあります。 replaceのような文字列のメソッドはすべてそのようになっています。
また、数値演算系のメソッドも同様です。

使おうとしているメソッド/関数がどちらの性質のものなのかは、仕様を確認しなければわかりません。


pythonのデータにはミュータブルなデータとイミュータブルなデータがあります。
ミュータブルなデータというのは、リストや辞書などのように、そのオブジェクトが持つ値や性質・状態を替えることができるデータです。
イミュータブルなデータというのは、文字列や数値などのようにそのオブジェクトを変更できないものです。

文字列はイミュータブルなデータなので、それを変更するメソッドは常に変更を加えた後の新しいオブジェクトを返します。

python

1a = 'abc'2b = a.replace('a', 'x')3 4print(a) # -> abc5print(b) # -> xbc

aに代入されている文字列'abc'を変更する方法が無いので、そういう仕様ですね。

ミュータブルなデータの場合、そのオブジェクトを変更することができるので、変更することが適切だったり、そもそも変更が求められている場合は、そのオブジェクトを変更するようになっています。

python

1a = ['10']2b = a.append('100')3 4print(a) # ['10', '100']5print(b) # None

リストというのはそれそのものを操作することが目的で使うことがある(多い?)ので、変更できるようになっていて、変更するためのメソッド(関数)が用意されています。
仕様を見ると、copyメソッド以外はそのものを変更するメソッドになっていますね。
https://docs.python.org/ja/3/tutorial/datastructures.html
また、例に出てくるスタックやキューなどはリストを変更することで機能している例です。

ただ、そういうデータでも、元は替えたくないという場合もあります。
https://docs.python.org/ja/3/library/functions.html#sorted
リストのソートのためのsorted関数は、リストのメソッドではありませんが、整列されたリストを返します。

python

1a = [3, 1, 4, 1]2y = a.sort()3 4print(a)5print(y)6 7b = [3, 1, 4, 1]8x = sorted(b)9 10print(b)11print(x)

sortメソッドはリストを変更しますが、sorted関数はソート済みの新たなリストを返します。

このように、データが変更可能だったとしても、必要であれば、元のデータを変更せずに新しいデータを作って返すようなメソッド/関数も作ることができるわけです。

コメントを投稿

0 コメント