Python での参照渡しと値渡し

Python での参照渡しと値渡し

C++ や Java などの他の言語から Python プログラミングに飛びついた開発者は、Python で引数を渡すプロセスに戸惑うことがよくあります。オブジェクト中心のデータ モデルとその割り当ての扱いは、基本レベルでの混乱の原因です。

この記事では、次の概念について説明します。 Pythonで値を参照によって渡す方法 そして 参照渡しの例を理解しようとする Pythonで。

目次

Python の値渡しと参照渡し

先を読むと何かを殴りたくなるかもしれないので、気を引き締めてください。 Python の引数受け渡しモデルは次のとおりです。 値渡しでも参照渡しでもない、オブジェクト参照渡しです。

関数に渡すオブジェクトのタイプに応じて、関数の動作は異なります。不変オブジェクトは値渡しを示しますが、可変オブジェクトは参照渡しを示します。

以下の例で、値渡しと参照渡しの違いを確認できます。

Python3




def> call_by_value(x):> > x> => x> *> 2> > print> (> 'in function value updated to'> , x)> > return> > def> call_by_reference(> list> ):> > list> .append(> 'D'> )> > print> (> 'in function list updated to'> ,> list> )> > return> > my_list> => [> 'E'> ]> num> => 6> print> (> 'number before='> , num)> call_by_value(num)> print> (> 'after function num value='> , num)> print> (> 'list before'> ,my_list)> call_by_reference(my_list)> print> (> 'after function list is '> ,my_list)>

出力

  number before= 6    in function value updated to 12    after function num value= 6    list before ['E']    in function list updated to ['E', 'D']    after function list is ['E', 'D'] 

上記のコードでは、Python がプログラム内で参照オブジェクト呼び出しの概念をどのように使用するかを示しました。

関数 call_by_value() で整数を渡します。整数は不変オブジェクトであるため、Python は値による呼び出しに従って動作し、関数内で行われた変更は関数の外部には反映されません。

次に、リストを参照によって関数に渡します。関数 call_by_reference() では、可変オブジェクトであるリストを渡します。 Python はこの関数の参照による呼び出しに従って動作し、関数内で行われた変更は関数の外部でも確認できます。

変数はオブジェクトではありません

ここで、 a は要素 X と Y を含むリストを指す変数です。 しかし、 a 自体はリストではありません。をオブジェクト X と Y を含むバケットであると考えてください。

 a = ['X', 'Y'] 

Python の参照渡しとは何ですか?

参照渡しとは、関数 (参照) を変数に渡す必要があることを意味します。これは、変数がメモリ内にすでに存在していることを意味します。

ここでは、変数 (バケット) が関数に直接渡されます。変数は、その内容 (オブジェクト) を伴うパッケージとして機能します。

上記のコード イメージでは、list と my_list は両方とも同じコンテナ変数であるため、メモリ内の同じオブジェクトを参照します。変数またはオブジェクトに対して関数によって実行される操作は、関数の呼び出し元に直接反映されます。たとえば、関数は変数の内容を完全に変更し、それがまったく別のオブジェクトを指すようにすることができます。

また、この関数は変数の内容を再割り当てして、以下と同じ効果を与えることができます。

要約すると、参照渡しでは、関数と呼び出し元は同じ変数とオブジェクトを使用します。

Python での参照渡しの例

この例では、関数modify_listは参照によりリストを取得します。この関数は、関数内で渡されたリストに文字列 Geeks を追加し、出力します。リストは変更可能なデータ型であるため、出力に見られるように、関数内でリストに加えられた変更は関数の外側にも反映されます。

Python3




def> modify_list(x):> > x.append(> 'Geeks'> )> > print> (> 'Inside function:'> , x)> > my_list> => [> 'Geeks'> ,> 'for'> ]> modify_list(my_list)> print> (> 'Outside function:'> , my_list)>

出力

  Inside function: ['Geeks', 'for', 'Geeks']    Outside function: ['Geeks', 'for', 'Geeks'] 

Python の値渡しとは何ですか?

このアプローチでは、次のコピーを渡します。 関数内の実際の変数をパラメータとして使用します。したがって、関数内のパラメータを変更しても、実際の変数には反映されません。

関数によって変数またはオブジェクトに対して実行される操作にも同じことが当てはまります。

要約すると、関数の呼び出し元のコンテキスト内の変数とオブジェクトのコピーは完全に分離されます。

Python での値渡しの例

ここでは、不変データ型である関数に整数 x を渡します。次に、関数内の整数値を更新し、更新された値を出力します。整数は不変のデータ型であるため、変更は関数の外部では見られません。

Python3




def> modify_integer(x):> > x> => x> +> 10> > print> (> 'Inside function:'> , x)> > x> => 5> print> (> 'Before function call:'> , x)> modify_integer(x)> print> (> 'After function call:'> , x)>

出力:

  Before function call: 5    Inside function: 15    After function call: 5 

Python プログラミングでは、関数に値を渡すときに参照オブジェクトの受け渡しの概念が使用されます。この記事では、Python における値渡しと参照渡しの概念を説明します。値を渡すさまざまなケースを例とともに示しました。 Python で関数に値を渡すことは他のコーディング言語とは異なりますが、このチュートリアルを使用すると、概念を簡単に理解し、作業に実装することができます。

こちらもお読みください:

Python は参照による呼び出しか値による呼び出しですか