0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Python グローバル変数とローカル変数について

Posted at

Pythonでは、変数のスコープ(有効範囲)によって、グローバル変数とローカル変数に分類されます。これらの違いや使い分けを正しく理解することは、効率的で読みやすいコードを書くために理解を深めておく。

目次
1.グローバル変数とは
2.ローカル変数とは
3.グローバル変数を関数内で変更する
4.nonlocalキーワードについて
5.まとめ

1.グローバル変数とは

グローバル変数は、プログラム全体でアクセスできる変数です。関数の外側で定義され、関数内からもアクセス可能ですが、関数内で変更するためには特別な宣言が必要です。

example.py
x = 10  # グローバル変数

def display_global():
    print(f"グローバル変数 x の値: {x}")

display_global() # 出力 ⇒ グローバル変数 x の値: 10

2.ローカル変数とは

ローカル変数は、関数やブロック内で定義される変数で、そのスコープは定義された関数またはブロック内に限定されます。同じ名前のグローバル変数があったとしても、ローカル変数が優先されます。

example.py
x = 20  # グローバル変数

def local_example():
    x = 5  # ローカル変数
    print(f"ローカル変数 x の値: {x}")

local_example() # 出力 ⇒ ローカル変数 x の値: 5
print(f"グローバル変数 x の値: {x}") # 出力 ⇒ グローバル変数 x の値: 20

3.グローバル変数を関数内で変更する

関数内でグローバル変数を変更する場合、globalキーワードを使用します。ただし、この方法は可読性やデバッグの難しさを引き起こすことがあるため、乱用は禁物。

example.py
counter = 0  # グローバル変数

def increment_counter():
    global counter  # グローバル変数を変更
    counter += 1
    print(f"関数内の counter: {counter}")

increment_counter() # 出力 ⇒ 関数内の counter: 1
print(f"関数外の counter: {counter}") # 出力 ⇒ 関数外の counter: 1

4.nonlocalキーワードについて

nonlocalキーワードは、ネストされた関数(関数内の関数)で、親関数のローカル変数を変更するために使用されます。

example.py
def outer():
    y = 10  # 親関数のローカル変数

    def inner():
        nonlocal y  # 親関数のローカル変数を参照
        y += 1
        print(f"inner関数内の y: {y}")
    
    inner() # 出力 ⇒ inner関数内の y: 11
    print(f"outer関数内の y: {y}") # 出力 ⇒ outer関数内の y: 11

outer()

4.まとめ

グローバル変数はプログラム全体で共有されるが、関数内で変更する場合はglobalが必要。
ローカル変数は関数やブロック内でのみ有効。
ネストされた関数内で親のローカル変数を操作する場合はnonlocalを使用。
適切なスコープを活用することで、プログラムの可読性や保守性が向上します。グローバル変数の乱用を避け、必要に応じてローカル変数や引数、戻り値を活用しましょう。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?