FrontPage

ローカル変数とグローバル変数

ローカル変数:関数内で定義される変数。関数外からはアクセスできない。

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(グローバル変数は変化しない)
ミュータブルなオブジェクトは「ポインタのような振る舞い」をする。これを理解することで、意図しない変数変更を防げる。
イミュータブルなオブジェクト(例:タプル)は安全だが、変更が必要な場合はリストや辞書を選ぶ。

ガベージコレクション(GC)

ガベージコレクション:Pythonが自動で不要になったメモリを解放する仕組み。
これはオブジェクトが「参照されなくなった」時点で、GCがメモリを解放するということ。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS