#author("2025-05-09T14:00:45+09:00","","") #author("2025-05-15T12:32:26+09:00","","") [[FrontPage]]~ *ローカル変数とグローバル変数 [#i8bbbbbf] ローカル変数:関数内で定義される変数。関数外からはアクセスできない。~ 例~ #code(py){{ def main(): b = 20 # ローカル変数 print(b) main() # print(b) # エラー:bは関数外で未定義 }} グローバル変数:プログラム全体でアクセス可能な変数。~ ただし、関数内でグローバル変数を「置き換える」とローカル変数として扱われる。~ 例 #code(py){{ a = 10 # グローバル変数 def func(): a = 20 # ローカル変数として扱われる print(a) # 20 func() print(a) # 10(グローバル変数は変わらない) }} 解決策:グローバル変数を関数内で編集する場合は、リストや辞書のような~ 「ミュータブルなオブジェクト」を使うか、コールバック関数のパラメータ(param)で渡す。~ 例~ #code(py){{ info = [False, -1, -1] # ミュータブルなリスト def mouseEvent(event, x, y, flags, param): info[0] = True # グローバルなリストを編集 cv2.setMouseCallback("nuko", mouseEvent, info) }} グローバル変数は「誰が参照・変更しているか」追跡しづらいため、極力避ける。 *リストとミュータブル・イミュータブル [#iae47f35] リスト:Pythonのリストは複数の要素を保持するデータ構造。例:a = [10, 20, 30]~ *ミュータブル・イミュータブル [#iae47f35] ここでリスト:Pythonのリストは複数の要素を保持するデータ構造である。例:a = [10, 20, 30]~ ミュータブル:リストや辞書は「変更可能」。内容を編集しても同じオブジェクトのまま。~ 例 #code(py){{ a = [10] def func(): a[0] = 4 # リストの内容を変更 func() print(a) # [4] }} イミュータブル:整数、文字列、タプルなどは「変更不可」。新しいオブジェクトが作成される。~ 例 #code(py){{ a = 10 def func(): a = 20 # 新しいローカル変数aを作成 func() print(a) # 10(グローバル変数は変化しない) }} ミュータブルなオブジェクトは「ポインタのような振る舞い」をする。これを理解することで、意図しない変数変更を防げる。 イミュータブルなオブジェクト(例:タプル)は安全だが、変更が必要な場合はリストや辞書を選ぶ。 *ガベージコレクション(GC) [#k077e751] ガベージコレクション:Pythonが自動で不要になったメモリを解放する仕組み。~ これはオブジェクトが「参照されなくなった」時点で、GCがメモリを解放するということ。~