0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Udemy Python3入門+応用】  64. 名前空間とスコープ

Posted at

※この記事はUdemyの
現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル
の講座を受講した上での、自分用の授業ノートです。
講師の酒井潤さんから許可をいただいた上で公開しています。

##■名前空間とスコープ

animal = 'cat'

def f():
    print(animal)

f()
result
cat

ここでの animal はグローバル変数なので、もちろん f() 内で呼び出すことができる。

animal = 'cat'

def f():
    animal = 'dog'
    print('after:', animal)

f()
result
after: dog

もちろんこれではdogが出力されるが、これはグローバル変数のanimalを上書きしているわけではない。

animal = 'cat'

def f():
    print(animal)
    animal = 'dog'
    print('after:', animal)

f()
result
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)
result
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)
result
local: dog
global: dog

関数内でglobalを使うことでグローバル変数のanimlalを呼び出すと、そのグローバル変数を上書きすることになる。

animal = 'cat'

def f():
    animal = 'dog'
    print(locals())

f()
print(globals())
result
{'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__)
result
TestFunc
Test func doc
global: __main__

関数名を指定すると、その関数の__name____doc__が出力できる。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?