ネームスペースは変数が保存される場所であり、スコープは変数が有効なスコープです。
- スコープ(Scope)とは、変数の有効範囲を指します。Python には 3 種類のスコープがあります。
- ローカル スコープは関数内のスコープを指します。
- グローバル スコープは、プログラム内のすべての関数の外側のスコープを指します。
- 組み込みスコープとは、Python インタープリターに組み込まれたスコープを指します。
- ネームスペースとは、変数が保存される場所を指します。Python の変数は異なる名前空間に保存されます。
- ローカル スコープ: 関数内で定義された変数と関数名を含むローカル名前空間。
- 囲みスコープ: 外部の入れ子関数の名前空間。入れ子関数で定義された変数名と関数名が含まれます。
- グローバル スコープ: モジュールで定義された変数名と関数名を含むグローバル名前空間。
- 組み込みスコープ: 組み込み名前空間には、Python インタープリターに組み込まれた関数名と変数名が含まれます。
簡単に言うと、関数 func() では、そのローカル名前空間は func であり、内部的に定義された属性またはメソッドはすべてこの名前空間内にあり、その有効範囲 (スコープとスコープ) は関数内にあります。
後の説明を助けるために、以下では Python のいくつかの組み込み関数を紹介します。
locals()
現在のスコープの名前空間内の変数を表示するために使用されます。キーが変数名、値が変数の値である辞書を返します。関数内でのみ使用できます。globals()
グローバル スコープの名前空間内の変数を表示するために使用されます。キーが変数名、値が変数の値である辞書を返します。どこでも使用できます。- dir( object ) 引数がない場合は、現在のローカル スコープ内の名前のリストを返します。引数が指定された場合、オブジェクトの有効なプロパティのリストを返そうとします。オブジェクトに
__dir__()
という名前のメソッドがある場合、そのメソッドが呼び出され、プロパティ リストを返す必要があります。
以下に使い方を簡単に説明します
a = 1
print('globals:', globals())
print('dir:', dir())
出力は次のとおりです。
globals: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000013C08576CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\project\\python100days\\1.py', '__cached__': None, 'a': 1}
dir: ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']
dir() によって返されるリストはすべての属性の変数名であるのに対し、globals() は前の変数名と各変数の値を含む辞書を返すことがわかります。
次に、名前空間とスコープの例を見てみましょう。
a = 1
def foo():
b = 2
print("foo内部的局部命名空间:", locals())
print("foo内部的全局命名空间:", globals())
print('foo内部的当前命名空间(应为当前局部命名空间):', dir())
foo()
print('foo外部的全局命名空间:', globals())
print('foo外部的当前命名空间(应为全局命名空间):', dir())
print('全局命名空间中’foo‘的命名空间:', dir(foo))
出力:
foo内部的局部命名空间: {'b': 2}
foo内部的全局命名空间: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002C6C3346CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\project\\python100days\\1.py', '__cached__': None, 'a': 1, 'foo': <function foo at 0x000002C6C338F160>}
foo内部的当前命名空间(应为当前局部命名空间): ['b']
foo外部的全局命名空间: {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000002C6C3346CD0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': 'D:\\project\\python100days\\1.py', '__cached__': None, 'a': 1, 'foo': <function foo at 0x000002C6C338F160>}
foo外部的当前命名空间(应为全局命名空间): ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'foo']
全局命名空间中’foo‘的命名空间: ['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
1. グローバル名前空間は foo の内側と外側で同じです; 2. foo の内側の場合、 dir
は現在の名前空間をローカルの名前空間として出力します; foo の外側の場合、dir は現在の名前空間をグローバルの名前空間として出力します。
3. dir(foo) の場合、関数オブジェクトのプロパティとメソッドの名前リスト (関数の組み込みプロパティとメソッド、関数オブジェクトで使用できる特別なメソッドを含む) を出力します。(追記: 関数オブジェクトの場合、関数オブジェクトの呼び出し方法を定義する __call__ メソッドなど、一部の属性とメソッドは Python インタープリターによって自動的に追加されます)