結論から言うと、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に関するご質問があれば、お気軽にお尋ねください。
リストオブジェクトのアドレスをGETする方法は?
返信削除list_a=[1,2,3]
print(hex(id(a)))