【参照値の値渡し??】Pythonの変数渡しについての理解 その1

雑学

更新月:2024/12
Pythonの変数渡しについて纏めた記事になります。Pythonの変数渡し、よく忘れちゃうんですよね。その1として、ミュータブル・イミュータブルの概念があって挙動が違うことが分かれば、まずOKです。

Pythonの変数渡しについての理解

Pythonで関数に変数を渡す際の挙動について理解することは、プログラミングを学ぶ上で非常に重要です。Pythonの変数渡しには少し独特な特徴があり、「参照値の値渡し」と呼ばれる方法で引数が渡されます。この概念は、初学者には少し混乱を招くことがありますが、簡単に説明します。

基本的な用語

まず、以下の2つの用語を理解しておくと、Pythonの変数渡しが分かりやすくなります:

  • 値渡し(Call by Value):関数に引数を渡すとき、その引数の「値」がコピーされて渡されます。関数内で引数を変更しても、元の値には影響しません。
  • 参照渡し(Call by Reference):関数に引数を渡すとき、その引数が指している「オブジェクトへの参照」が渡されます。関数内で引数を変更すると、元のオブジェクトも変更されます。

Pythonの変数渡し

Pythonでは、実際には「参照値の値渡し」という少し特異な方法が使われています。これを簡単に言うと、「変数が指し示すオブジェクトへの参照が渡されますが、その参照自体を変更することはできません」となります。

オブジェクトの種類

Pythonで扱うオブジェクトには、2つの大きな種類があります:

  • ミュータブルオブジェクト(変更可能なオブジェクト):リスト、辞書、集合など。これらのオブジェクトは関数内で変更されると、呼び出し元にも影響が及びます。
  • イミュータブルオブジェクト(変更不可能なオブジェクト):整数、文字列、タプルなど。これらのオブジェクトは関数内で変更しても、呼び出し元には影響を与えません。

実例で理解する

1. ミュータブルオブジェクトの場合

def modify_list(my_list):
    my_list.append(4)  # リストに4を追加

# 関数を呼び出す前のリスト
original_list = [1, 2, 3]
modify_list(original_list)

# 関数を呼び出した後のリスト
print(original_list)  # [1, 2, 3, 4] と表示される
    

この例では、リスト(ミュータブルオブジェクト)が関数に渡され、その内容が変更されました。リストは参照渡しされるので、関数内でリストを変更すると元のリスト(`original_list`)にも変更が反映されます。

2. イミュータブルオブジェクトの場合

def modify_integer(num):
    num = 10  # numに新しい値を代入

# 関数を呼び出す前の変数
original_number = 5
modify_integer(original_number)

# 関数を呼び出した後の変数
print(original_number)  # 5 と表示される

この例では、整数(イミュータブルオブジェクト)が関数に渡されました。関数内で新しい値を代入しても、元の整数には影響がありません。整数などのイミュータブルオブジェクトは新しい値が代入されることで新しいオブジェクトが作られるため、呼び出し元の変数には変更が反映されません。

まとめ

Pythonにおける「参照値の値渡し」とは、変数が指し示すオブジェクトの参照が渡されることを意味します。しかし、その参照が「そのまま渡されるわけではなく」、ミュータブルなオブジェクト(例えばリストや辞書)を操作した場合は変更が元のオブジェクトにも反映されます。一方で、イミュータブルなオブジェクト(整数や文字列)を操作しても、元のオブジェクトには影響を与えません。

初心者にとっては、これらの挙動が少し直感的でないかもしれませんが、重要なのはオブジェクトの種類(ミュータブルかイミュータブルか)が変数渡しの結果に大きく影響するということです。これを理解することで、Pythonでの変数の扱いがより明確になるでしょう。

関連記事

外部リンク

生成AIメモ

  • 利用AI:ChatGPT 4o mini、一部利用
  • プロンプト1:pythonの変数渡しは「参照値の値渡し」と聞きました。初学者に向けた丁寧な説明をお願いしたいです。
  • プロンプト2:今の内容を全てhtml形式で示してください。記事として残しておこうと思います。
  • プロンプト3:styleタグを使わない形で出力してほしいです

内容チェック済。