Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
16
Help us understand the problem. What are the problem?

Pythonのクロージャについて

クロージャ(Closure)

関数の中の関数のこと
外の関数のスコープである変数にアクセスできる。

def outer():
  val = "Hello World!!"
  def inner():
      print(val)  # 関数'outer'外の変数'val'にアクセス可能
  inner()

outer()
# >>> Hello World!!

注意点

スコープに注意しなければならない。
pythonでは現在の関数のスコープから変数を参照する。

# "Goodbye World??"出力したい
def outer():
  val = "Hello World!!"  # スコープ: 'outer'
  def inner():
      val = "Goodbye World??"  # スコープ: 'inner'
  inner()
  print(val)  # 'outer'のvalを参照する
              # innerのvalは新しく生成されたため別のオブジェクト

outer()
# >>> Hello World!!

解決方法

nonlocalを入れるだけ

def outer():
  val = "Hello World!!"
  def inner():
      nonlocal val  # nonlocalを入れる
      val = "Goodbye World??"
  inner()
  print(val)

outer()
# >>> Goodbye World??
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
16
Help us understand the problem. What are the problem?