Magicode logo
Magicode
1
2 min read

Pythonのスコープを理解するパターン4選

はじめに

この記事はQiitaに投稿したものの動作確認用に再編成したものです。

元記事: https://qiita.com/comapi/items/b287904b2b6354036476

Pythonのスコープについて理解するためのコードを4つ紹介いたします。

パターン①:基本

def func():
   orange = 300

orange = 100
func()

print(orange)

100

print()で出力されるorangeはグローバル変数のorangeです。 関数内のorangeはローカル変数であるため、代入した300は反映されていません。

パターン②:グローバル変数を読み取る

def func():
   print(orange)

orange = 42
func()

42

関数内でorangeがprint()で出力されていますが、ローカルスコープ内にorangeへの代入がないです。この場合はグローバル変数から値を読み取ってきます。

パターン③:グローバル宣言

def func():
   global orange
   orange = 'local'

orange = 'global'
func()
print(orange)

local

ローカルスコープ内でグローバル宣言をすることで、グローバル変数を読み取り・書き変えることができます。

パターン④:エラー例

def func():
   print(orange)
   orange = 'local'

orange = 'global'
func()

UnboundLocalError
local variable 'orange' referenced before assignment
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
/tmp/ipykernel_41/2556656841.py in <module> 4 5 orange = 'global' ----> 6 func()
/tmp/ipykernel_41/2556656841.py in func() 1 def func(): ----> 2 print(orange) 3 orange = 'local' 4 5 orange = 'global'
UnboundLocalError: local variable 'orange' referenced before assignment

このコードはエラーとなります。理由は以下の順にプログラムが実行されるためです。

  1. 関数の中にorangeへの代入があるため、パターン②のようにグローバル変数を読み取りに行く必要がないと判断
  2. ローカルスコープ内のorangeに代入される前にprint()で出力されてしまってエラーとなる

最後に

ここまでご覧いただきありがとうございます。 Magicodeはエラーも再現できる点がとても良いですね!

Discussion

コメントにはログインが必要です。