1
1

More than 1 year has passed since last update.

40代おっさんPythonを勉強する(名前空間とスコープ編)

Posted at

本記事について

この記事はプログラミング初学者の私が学んでいく中でわからない単語や概要を分かりやすくまとめたものです。
もし不正などありましたらコメントにてお知らせいただければ幸いです。

名前空間とスコープ

  • 各関数はそれぞれ専用の名前空間を定義される
  • メインの領域のグローバルスコープ(大域空間)と関数内のローカルスコープ(局所空間)が分かれている
  • 大域空間ではグローバル変数を定義し、局所空間ではローカル変数を定義する
  • グローバル変数の値は関数内から参照できる
#  id()関数はPythonが全ての変数を識別するための番号

name = 'としき' # グローバル変数
print('グローバル:',  name, id(name))
def show_name():
    print('内部関数:', name, id(name))

show_name()
print('グローバル:', name, id(name))

こちらはエラーが起きる

name = 'としき' # グローバル変数
print('グローバル:',  name, id(name))
def show_name():
    print('内部関数:', name, id(name))
    name = 'あっきー'

show_name()
print('グローバル:', name, id(name))
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
セル1  c:\Users\toaik\OneDrive\デスクトップ\python\enPiT\kansuu\namaekuukan.ipynb in <cell line: 9>()
      6     print('内部関数:', name, id(name))
      7     name = 'あっきー'
----> 9 show_name()
     10 print('グローバル:', name, id(name))

セル1  c:\Users\toaik\OneDrive\デスクトップ\python\enPiT\kansuu\namaekuukan.ipynb in show_name()
      5 def show_name():
----> 6     print('内部関数:', name, id(name))
      7     name = 'あっきー'

UnboundLocalError: local variable 'name' referenced before assignment
  • もし、関数内に同じ変数名を新たに定義すれば、それはローカル変数になる
  • 2つの変数は同じ名前になっても、別々のものとされる
name = 'としき' # グローバル変数
print('グローバル:',  name, id(name))
def show_name():
    name = 'あっきー'
    print('内部関数:', name, id(name)) # idが異なる
    
show_name()
print('グローバル:', name, id(name)) # グローバル変数の値は変わらない

グローバル: としき 2389997792592
内部関数: あっきー 2389965814640 ここだけがIDが違う
グローバル: としき 2389997792592

  • 関数内でもグローバル変数を編集できる(編集はしないほうが良い)
name = 'としき' # グローバル変数
print('グローバル:',  name, id(name))
def show_name():
    global name # グローバル変数だと明示
    name = 'あっきー' # 値を変更
    print('内部関数:', name, id(name)) # 新しいIDになる
    # IDが変わったのは文字列型が変更不能のため
    
show_name()
print('グローバル:', name, id(name)) # グローバル変数の値は変わらない

グローバル: としき 2389965814064
内部関数: あっきー 2390001760656
グローバル: あっきー 2390001760656

  • もしやるならグローバル領域で代入するほうがよい
name = 'としき' # グローバル変数
print('グローバル:',  name, id(name))
def show_name():
    name = 'あっきー' # 値を変更
    print('内部関数:', name, id(name)) # 新しいIDになる
    return name
    
show_name()
print('グローバル:', name, id(name)) # グローバル変数の値は変わらない

name = show_name()
print('グローバル:', name, id(name))

グローバル: としき 2389965781584
内部関数: あっきー 2390001760656
グローバル: としき 2389965781584
内部関数: あっきー 2390001760656
グローバル: あっきー 2390001760656

  • 引数で同じ変数名を使ってもグローバル変数を編集できない
name = 'としき' # グローバル変数
print('グローバル:',  name, id(name))
def show_name(name):
    print('内部関数:', name, id(name)) # 古いIDになる
    name = 'あっきー' # 値を変更
    print('内部関数:', name, id(name)) # 新しいIDになる
    
show_name(name)
print('グローバル:', name, id(name)) # グローバル変数の値は変わらない

グローバル: としき 2389997633584
内部関数: としき 2389997633584
内部関数: あっきー 2390000480048
グローバル: としき 2389997633584

  • プログラムを書くとき、グローバルかローカルか、気を付けないと違う変数の値を変えてしまうから、デバックも難しくなる

参考

1
1
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
1
1