※この記事はUdemyの
「現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル」
の講座を受講した上での、自分用の授業ノートです。
講師の酒井潤さんから許可をいただいた上で公開しています。
##■名前空間とスコープ
animal = 'cat'
def f():
print(animal)
f()
cat
ここでの animal
はグローバル変数なので、もちろん f()
内で呼び出すことができる。
animal = 'cat'
def f():
animal = 'dog'
print('after:', animal)
f()
after: dog
もちろんこれではdog
が出力されるが、これはグローバル変数のanimal
を上書きしているわけではない。
animal = 'cat'
def f():
print(animal)
animal = 'dog'
print('after:', animal)
f()
UnboundLocalError: local variable 'animal' referenced before assignment
最初にanimal
をprintしようとするとエラーとなった。
これは、関数内にローカル変数を宣言する記述があり、それが記述される前にprintしようとしているというエラー。
animal = 'cat'
def f():
# print(animal)
animal = 'dog'
print('local:', animal)
f()
print('global:', animal)
local: dog
global: cat
f()
内ではローカル変数のanimal
を宣言してそれをprint、
最終行のprintではグローバル変数のanimal
をprintしている。
animal = 'cat'
def f():
global animal
animal = 'dog'
print('local:', animal)
f()
print('global:', animal)
local: dog
global: dog
関数内でglobal
を使うことでグローバル変数のanimlal
を呼び出すと、そのグローバル変数を上書きすることになる。
animal = 'cat'
def f():
animal = 'dog'
print(locals())
f()
print(globals())
{'animal': 'dog'}
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fd8f9f687f0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'test.py', '__cached__': None, 'animal': 'cat', 'f': <function f at 0x7fd8f9db9160>}
locals()
やglobals()
を使うことで、ローカル変数やグローバル変数をdictionaryとして呼び出すことができる。
printしたグローバル変数を見てみると、予めpython側で定義している変数があることがわかる。
def TestFunc():
"""Test func doc"""
print(TestFunc.__name__)
print(TestFunc.__doc__)
TestFunc()
print('global:', __name__)
TestFunc
Test func doc
global: __main__
関数名を指定すると、その関数の__name__
や__doc__
が出力できる。