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