Pythonのglobalキーワードとは?変数スコープの基本と使い方を解説
Pythonプログラムでは、変数ごとに異なるスコープ(有効範囲)が存在します。変数は宣言された場所によって、関数内からアクセスできる場合とできない場合があります。ときには、現在のスコープの外側から関数内の変数を変更したいという場面も生じます。そのようなケースで活用されるのが、globalキーワードです。
globalキーワードのポイント
関数の外で宣言された変数は、デフォルトでグローバル変数として扱われます。
関数内で宣言された変数を変更したい場合は、globalキーワードを使用します。
globalキーワードを付けない場合、関数内の変数はデフォルトでローカル変数になります。
globalキーワードなしの場合
まず、globalキーワードを使わずに変数を変更しようとした場合の挙動を確認しましょう。これにより、次のセクションで紹介するglobalキーワードの効果がより明確に理解できます。
以下の例では、関数の中からグローバル変数を変更しようとしています。しかし、関数内からそのままグローバル変数を変更することはできないため、エラーが発生します。
コード例
var = 321
# 変数を変更する関数
def modify():
var = var * 2
print(var)
# 関数の呼び出し
modify()実行結果
UnboundLocalError: local variable 'var' referenced before assignment
このように、UnboundLocalErrorが発生します。これは、Pythonが関数内のvarをローカル変数として解釈するためです。代入前に参照されたため、エラーとなっています。
globalキーワードありの場合
次に、関数内で変数名の前にglobalキーワードを付けて宣言します。これにより、その変数はグローバル変数として扱われ、関数内でも変更可能になります。
コード例
var = 321
# 変数を変更する関数
def modify():
global var
var = var * 2
print(var)
# 関数の呼び出し
modify()実行結果
642
今度はエラーが発生せず、グローバル変数varの値が2倍の「642」に更新されました。
ネストした関数でのglobalキーワード
関数の中に関数を定義するネスト構造(入れ子構造)の場合も同様に、内側の関数でglobalキーワードを宣言する必要があります。これにより、内側の関数からでもグローバル変数を変更できるようになります。
コード例
def outer_func():
var = 321
# 変数を変更する関数
def modify():
global var
var = var * 2
print(var)
# 関数の呼び出し
modify()
outer_func()実行結果
642
このように、内側の関数でglobalキーワードを宣言することで、ネストした関数からでもグローバル変数を正しく操作できます。
まとめ
globalキーワードは、関数内からグローバル変数を読み書きするために不可欠な機能です。ただし、乱用するとプログラムの可読性や保守性が低下するため、必要最小限にとどめることが推奨されます。変数のスコープを正しく理解し、適切に活用しましょう。
-
Pythonでグローバル変数を宣言する方法!globalキーワードの基本と実例を解説
グローバル変数とは何か?グローバル変数(大域変数)とは、プログラム全体で有効なスコープを持つ変数のことです。別の場所で同じ名前の変数によって上書き(シャドウイング)されない限り、プログラム内のどこからでも参照・アクセスできます。すべてのグローバル変数の集合は、プログラムの「グローバル環境」または「グローバルスコープ」と呼ばれます。Pythonでは、変数名の前に global キーワードを付けることで、その変数をグローバル変数として宣言できます。なお、すべての変数には「宣言・定義されたブロック」がスコープとして適用されます。つまり、変数は宣言された位置より後のコードでのみ使用可能である点に注意し
-
【Python入門】関数内でグローバル変数を使う方法をわかりやすく解説
「グローバル」と「ローカル」という用語は、スクリプトやプログラム内における変数の有効範囲(スコープ)を表します。グローバル変数とはプログラムのどこからでもアクセスできる変数のことで、ローカル変数はその変数が定義された範囲(関数の中など)からしかアクセスできません。ローカル変数には、グローバルな位置からアクセスすることはできない点に注意しましょう。 グローバル変数とは、関数の外側で定義・宣言された変数のことで、プログラム内のどこからでも自由に利用できます。 ただし、関数のスコープ内に同じ名前の変数が定義されている場合は、グローバル変数の値ではなく、関数内で定義された値が優先して出力されます。 例