はじめに
プログラミングの基本となる考え方を、私の整理も兼ねて紹介します。
破壊的処理とは
簡単に言うと、元のデータを上書きして結果を残す処理のことをいいます。具体的には次のとおりです。
>>> a = [5, 8, 3, 4, 1]
>>> a.sort()
>>> a
[1, 3, 4, 5, 8]
この例では、元のデータ(変数a)が処理結果として上書きされます。
非破壊的処理とは
簡単に言うと、元のデータを改変せずに、元のデータとは別の新しいデータとして結果を残す処理のことをいいます。具体的には次のとおりです。
>>> a = [5, 8, 3, 4, 1]
>>> b = sorted(a)
>>> b
[1, 3, 4, 5, 8]
>>> a
[5, 8, 3, 4, 1]
この例では、元のデータ(変数a)は改変されず元のデータを維持しています。処理結果(変数b)は処理後の新しいデータとして保持されています。
破壊的処理と非破壊的処理との使い分け
破壊的処理は元のデータを直接操作することが多く、処理後のデータ領域を確保する必要がないため、メモリー割り当てを抑えることができます。結果、非破壊的処理に比べると処理速度の点で有利です。
一方、非破壊的処理は関数型プログラミング(引数を入力として、処理結果として返り値を返すアーキテクチャ。グローバル変数は原則として利用しない)には欠かせません。元のデータは関数に入力するだけで改変はせず、処理結果は別のデータとして次の関数に渡して処理を続けていく、という考え方になるからです。