注:両方の例を見たので、このPythonとC ++にタグを付けていますが、質問は言語に依存しません。
オブジェクトを変更する関数またはクラスメソッドには、2つの選択肢があります。問題のオブジェクトのデータを直接変更するか、新しいコピーを作成して、元のデータをそのままにして返すかです。一般に、関数から何が返されるかを見れば、どれがどれであるかがわかります。
場合によっては、両方を実行し、元のオブジェクトを変更してから、そのオブジェクトへのコピーまたは参照を返す関数が見つかります。これがどちらか一方だけを行うよりも有利な場合はありますか?
オブジェクトへの参照を返すことに依存するFluentInterfaceまたはMethodChainingの例を見てきましたが、それは文脈上明らかなはずの特殊なケースのようです。
私の最初の悪い例は、 Pythonのドキュメントから直接引用したもので、可変のデフォルトパラメータの問題を示しています。私にとって、この例は非現実的です。関数がパラメーターを変更する場合、デフォルトを設定しても意味がありません。コピーを返す場合は、変更を行う前にコピーを作成する必要があります。問題は、両方を実行しようとするためにのみ存在します。
def f(a, L=[]):
L.append(a)
return L
2番目の例は、関数内のMicrosoftC++からのCStringT::MakeUpper
ものです。ドキュメントには、戻り値について次のように記載されています。
文字列のコピーを返しますが、すべて大文字で返します。
これにより、オリジナルは変更されないままであると予想されます。問題の一部は、ドキュメントが誤解を招くことです。プロトタイプを見ると、文字列への参照が返されていることがわかります。よく見ていない限り、これに気付くことはありません。結果を新しい文字列に割り当てると、エラーなしでコンパイルされます。驚きは後で来る。