2024年5月1日水曜日

Pythonのdefでローカルに作られたリストオブジェクトは関数実行後も保持される?

結論から言うと、Pythonのdefでローカルに作られたリストオブジェクトは、関数実行後もデフォルトでは保持されません。**

これは、関数スコープと呼ばれる範囲の影響です。関数スコープとは、関数内で定義された変数やオブジェクトが、その関数内でのみ有効となる範囲を指します。

つまり、def内でリストオブジェクトを作成しても、そのリストオブジェクトはその関数の実行が終わるとともに破棄されてしまいます。

Python
def create_list():
  # 関数内でリストオブジェクトを作成
  local_list = [1, 2, 3]
  # リストオブジェクトを操作
  local_list.append(4)
  print(local_list)  # [1, 2, 3, 4]

# 関数実行
create_list()

# 関数実行後にリストオブジェクトにアクセスしようとするとエラー
print(local_list)  # NameError: name 'local_list' is not defined

上記のように、関数実行後にlocal_listにアクセスしようとすると、NameErrorが発生します。これは、local_listが関数スコープ内でのみ有効な変数であり、関数実行後に破棄されているためです。

リストオブジェクトを保持したい場合

関数の実行後もリストオブジェクトを保持したい場合は、グローバル変数を使用するか、オブジェクトを関数から返す必要があります。

グローバル変数を使用する

Python
local_list = []  # グローバル変数としてリストを作成

def create_list():
  # グローバル変数のリストを操作
  local_list.append(1)
  local_list.append(2)
  local_list.append(3)

# 関数実行
create_list()

# 関数実行後もリストオブジェクトにアクセスできる
print(local_list)  # [1, 2, 3]

この場合、local_listはグローバル変数として宣言されているため、関数実行後も保持されます。

オブジェクトを関数から返す

Python
def create_list():
  # 関数内でリストオブジェクトを作成
  local_list = [4, 5, 6]
  return local_list

# 関数実行
result_list = create_list()

# 関数実行後もリストオブジェクトにアクセスできる
print(result_list)  # [4, 5, 6]

この場合、create_list関数はリストオブジェクトを返却するため、関数実行後もそのリストオブジェクトにアクセスすることができます。

まとめ

  • 関数内でローカルに作られたリストオブジェクトは、デフォルトでは関数実行後も保持されない
  • リストオブジェクトを保持したい場合は、グローバル変数を使用するか、オブジェクトを関数から返す必要がある。

その他

  • 関数スコープについてより詳しく理解したい場合は、以下のリファレンスを参照してください。
    • Python ドキュメント - 関数: [無効な URL を削除しました]
  • その他、Pythonに関するご質問があれば、お気軽にお尋ねください。

1 件のコメント:

  1. リストオブジェクトのアドレスをGETする方法は?
    list_a=[1,2,3]
    print(hex(id(a)))

    返信削除