【Python】 Python ~ 基本編 / global・nonlocal ~

■ はじめに

Pythonで、グローバル変数(global variables)を扱ったのでメモ。
ただ、あんまり使いたくない、、、

それと、nonlocal ってのもあるらしいので、これもメモ。

目次

【1】global
 例:global宣言
【2】nonlocal
 例
  Case1:nonlocal宣言を使わない場合
  Case2:nonlocal宣言を使う場合
【3】実験コード
 その1
 その2
 その3:global・nonlocal混合

【1】global

* グローバル変数(global variables)

例:global宣言

global_val = 'hello'

def demo_function():
  # ★global宣言★
  global global_val
  global_val = 'world'
  print(global_val)

print(global_val)
demo_function()
print(global_val)

出力結果

hello
world
world

【2】nonlocal

* 内部関数で外部関数の変数を変更したい場合、nonlocal宣言を用いる
 => 内部関数については、以下の関連記事を参照のこと。

Python ~ 基本編 / 関数・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/02/000000

Case1:nonlocal宣言を使わない場合

def outer():
  print("外部関数")
  value = 1

  def inner():
    print("内部関数")
    value = 2 # ここはローカル変数として定義

  # 外部関数から内部関数を呼び出す
  inner()
  print(value) # 1 (内部関数の値に影響されない)

outer()

Case2:nonlocal宣言を使う場合

def outer():
  print("外部関数")
  value = 1

  def inner():
    print("内部関数")
    nonlocal value # 追加
    value = 2

  # 外部関数から内部関数を呼び出す
  inner()
  print(value) # 2

outer()

【3】実験コード

その1

global_val = 'hello'

def demo_function():
  print(global_val)

print(global_val)
demo_function()
print(global_val)

出力結果

hello
hello
hello

その2

global_val = 'hello'

def demo_function():
  global_val = 'world'
  print(global_val)

print(global_val)
demo_function()
print(global_val)

出力結果

hello
world
hello

その3:global・nonlocal混合

value = "1"
def sample_method():
  value = "2"

  def do_local():
    value = "3"

  def do_nonlocal():
    nonlocal value
    value = "4"

  def do_global():
    global value
    value = "5"

  do_local()
  print("【A】", value)
  do_nonlocal()
  print("【B】", value)
  do_global()
  print("【C】", value)

print("【D】", value)
sample_method()
print("【E】", value)

出力結果

【D】 1
【A】 2
【B】 4
【C】 4
【E】 5

参考文献

https://www.sejuku.net/blog/58897

関連記事

Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / 関数・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/02/000000