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

Pythonの関数における参照渡しと値渡しの仕組みを徹底解説

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

この動作を理解することは、リストや辞書などのミュータブル(変更可能)なオブジェクトを扱ううえで非常に重要です。以下、具体的な例を見ていきましょう。

例1:関数内でオブジェクトを変更する場合

次の例では、関数に渡されたリストに対してappend()で要素を追加しています。これは元のオブジェクト自体を変更する操作です。

#!/usr/bin/python3

# 関数の定義
def changeme(mylist):
    """渡されたリストをこの関数内で変更します"""
    mylist.append([1, 2, 3, 4])
    print("関数内の値:", mylist)
    return

# changeme関数を呼び出す
mylist = [10, 20, 30]
changeme(mylist)
print("関数外の値:", mylist)

実行結果

ここでは、渡されたオブジェクトへの参照を保持したまま、同じオブジェクトに値を追加しています。そのため、関数内外で同じ内容が出力されます。

関数内の値: [10, 20, 30, [1, 2, 3, 4]]
関数外の値: [10, 20, 30, [1, 2, 3, 4]]

関数内での変更が呼び出し元にも影響している点に注目してください。これが「参照渡し」の典型的な挙動です。

例2:関数内で参照を上書きする場合

今度は、引数として渡された参照を、関数内で新しいオブジェクトに代入し直す例です。

#!/usr/bin/python3

# 関数の定義
def changeme(mylist):
    """渡されたリストをこの関数内で変更します"""
    mylist = [1, 2, 3, 4]  # mylistに新しい参照を代入
    print("関数内の値:", mylist)
    return

# changeme関数を呼び出す
mylist = [10, 20, 30]
changeme(mylist)
print("関数外の値:", mylist)

実行結果

パラメータmylistは関数changemeにとってローカルな変数です。関数内でmylistに新しいリストを代入しても、それは単にローカル変数が新しいオブジェクトを指すようになるだけで、呼び出し元のmylistには何の影響も与えません。

関数内の値: [1, 2, 3, 4]
関数外の値: [10, 20, 30]

まとめ:参照渡しを正しく理解するポイント

  • ミュータブルなオブジェクト(リスト、辞書、セットなど)の場合:append()のような破壊的な操作を行うと、呼び出し元のオブジェクトも変更されます。
  • イミュータブルなオブジェクト(数値、文字列、タプルなど)の場合:関数内で再代入しても呼び出し元には影響しません。
  • 引数への再代入はあくまでローカル変数の付け替えであり、呼び出し元には反映されません。

Pythonの引数の仕組みは「オブジェクト参照渡し(call by object reference)」と呼ばれることもあります。この挙動を正しく把握しておくことで、意図しない副作用を防ぎ、安全なコードを書けるようになります。

  1. Pythonのissubset()関数とは?部分集合の判定方法を実例付きで解説

    本記事では、Python標準ライブラリに用意されているissubset()関数の仕組みと使い方について詳しく解説します。 issubset()メソッドは、あるセット(集合)のすべての要素が、引数として渡した別のセットにも含まれている場合にブール値のTrueを返し、1つでも含まれていない要素があればFalseを返します。 下の図では、BはAの部分集合です。もしAとBが同一のセットであれば、両者は互いに部分集合の関係にあるといえます。つまり、両方のセットがまったく同じ要素を持っているということを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値

  2. Pythonのintersection()関数とは?集合の共通要素(積集合)を求める方法

    この記事では、Pythonのセット(集合)に対して実行できるintersection()関数について詳しく解説します。数学における「積集合(インターセクション)」とは、2つの集合から共通する要素を見つけ出すことを指します。構文<セット名>.intersection(<セットa1>, <セットa2>, …)戻り値引数として渡されたすべての集合に共通する要素(積集合)が、新しいセットとして返されます。使用例set_1 = {t,u,t,o,r,i,a,l} set_2 = {p,o,i,n,t} set_3 = {t,u,t} # 2つの集合の積集合 print