Programmingバックエンド開発者

Pythonにおけるパラメータの渡し方はどのように機能しますか(オブジェクト参照による呼び出し / 共有による呼び出し)?可変型と不可変型にどのように影響し、予期しない変更を回避するにはどうすればよいですか?

Hintsage AIアシスタントで面接を突破

答え。

Pythonでは、パラメータは「オブジェクト参照による呼び出し」(または「共有による呼び出し」)の原則に従って渡されます。これは、関数にオブジェクトへの参照が渡されることを意味し、オブジェクトそのものは渡されません。オブジェクトが可変(mutable)であれば、関数内でその内容を変更でき、その変更は外部の変数に反映されます。不変(immutable)オブジェクト、たとえば数や文字列の場合、関数内での変更は新しいオブジェクトを生成し、元のものには影響を及ぼしません。

可変オブジェクトの例:

def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]

不変オブジェクトの例:

def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5

問題のある質問。

質問: 「Pythonでは変数は関数に参照として渡されるのか、それとも値として渡されるのか?」

答え: どちらでもありません。変数はオブジェクトへの参照を渡すものであり、変数そのものを渡すわけではなく、外部の変数に対してオブジェクトを置き換えることはできません。

このテーマの粒度の知らなさからくるリアルなエラーの例。


逸話 データを解析するプロジェクトの一つで、リストをフィルタリングするために関数を使用しました。関数内で新しいリストが作成されず、元のリストの変更によってフィルタリングが行われました。その結果、元のデータが消失し、スクリプトを数回実行した後にはデータがなくなっていました。


逸話 ジュニア開発者は、他のパラメータ(リスト)が変更できたため、文字列も関数内で「参照によって」変更できると考えていました。その結果、関数を呼び出した後、プログラムは期待された変更を受け取らず(文字列が変更されなかった)、不可解なバグが発生しました。


逸話 REST APIで入力データをフィルタリングする際、開発者はパラメータ辞書のコピーを作成するのを忘れ、バリデーション時に値が「失われ」てしまい—パラメータが元のオブジェクトから削除され、以降のリクエストのロジックが壊れました。