Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】引数は値渡し?参照渡し?「オブジェクト参照渡し」の仕組みを徹底解説

Pythonの引数の受け渡しには、一般的なプログラミング言語でいう「値渡し(Call by Value)」や「参照渡し(Call by Reference)」とは少し異なる、「オブジェクト参照渡し(Call by Object Reference)」、あるいは「共有渡し(Call by Sharing)」と呼ばれる独自のメカニズムが採用されています。

この仕組みを正しく理解することは、意図しないバグを防ぎ、Pythonらしいコードを書くために非常に重要です。

イミュータブル(変更不可)なオブジェクトの場合

整数(int)、文字列(str)、タプル(tuple)などのイミュータブルなオブジェクトを関数に渡す場合、その動作は値渡しのように見えます。関数内で引数に別の値を代入しても、呼び出し元の元の変数には一切影響しません。

ミュータブル(変更可能)なオブジェクトの場合

一方、リストや辞書などのミュータブルなオブジェクトを渡した場合は、参照渡しのような挙動になります。

Pythonでは、すべての引数はオブジェクトへの参照として渡されると考えることができます。つまり、関数内で引数が参照しているオブジェクトそのものを変更すると、その変更は呼び出し元の関数にも反映されます。

サンプルコード

student = {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25}

def test(student):
    new = {'alok': 30, 'Nevadan': 28}
    student.update(new)
    print("Inside the function", student)
    return

test(student)
print("outside the function:", student)

実行結果

Inside the function {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25, 'alok': 30, 'Nevadan': 28}
outside the function: {'Archana': 28, 'krishna': 25, 'Ramesh': 32, 'vineeth': 25, 'alok': 30, 'Nevadan': 28}

コードの解説

この例では、辞書型の student を関数 test() に渡しています。関数内で update() メソッドを使って新しいキーと値のペアを追加すると、関数の外側でもまったく同じ変更結果が出力されています。

これは、引数として渡されたのがオブジェクトそのものではなく、オブジェクトへの参照であるためです。関数内外で同じ辞書オブジェクトを共有しているため、片方での変更がもう片方にも現れるのです。

注意点

もし呼び出し元のオブジェクトを変更されたくない場合は、copy() メソッドなどでコピーを作成してから関数に渡すか、関数内で新しいオブジェクトを生成するようにしましょう。

  1. C#における引数(パラメータ)の渡し方:値渡し・参照渡し・out・paramsを徹底解説

    C#では、メソッドに引数(パラメータ)を渡す方法として、「値渡し」と「参照渡し」の2つが基本となります。さらに、outパラメータやparams配列を活用することで、より柔軟な引数の受け渡しが実現できます。それぞれの仕組みと使い分けのポイントを詳しく見ていきましょう。 値渡し(Value) 値渡しは、引数の実際の値をメソッドの仮引数にコピーする方法です。この場合、メソッド内部でパラメータに対して行った変更は、呼び出し元の引数には一切影響しません。元のデータを保護したい場合に適した方法です。 参照渡し(Reference) 参照渡しは、引数のメモリ上の場所への参照を仮引数にコピーする方法です。

  2. Python Matplotlibで多変量関数をプロットする方法

    Pythonで多変量関数(複数の変数を持つ関数)を視覚的に表現したい場合、Matplotlibの散布図を活用すると、x・y・zの3つの変数の関係を1つのグラフ上で直感的に把握できます。ここでは、具体的な手順とサンプルコードを交えて解説します。実装の手順図のサイズを設定し、サブプロット間および周囲の余白(パディング)を調整します。NumPyを使って、ランダムな x、y、z のデータ点を生成します。図(figure)とサブプロット(axes)のセットを作成します。x・y・z のデータ点をもとに散布図を描画します。ScalarMappableインスタンス s に対してカラーバーを作成し、z値の色の対