このチュートリアルでは、Python の名前空間、Python プログラムでオブジェクトに割り当てられたシンボル名を整理するために使用される構造、名前空間が重要な理由、および Python プログラムで名前空間を使用する方法について学びます。名前空間について簡単に説明しましょう。
ネームスペースとは何ですか?
Python では、名前空間を使用して各オブジェクトに一意の名前を付ける方法があります。変数とメソッドは、Python のオブジェクトの例です。別の言い方をすれば、既知の象徴的な名前と、それぞれの名前が指すものの詳細を集めたものです。名前は辞書のキーと考えることができ、オブジェクトは名前空間の値です。本物のモデルでそれを理解する必要があります - 名前空間は姓に似ています。クラス内に複数の「Peter」名がある場合、「Peter」名を見つけるのが難しい場合があります。ただし、「Peter Warner」または「Peter Cummins」と具体的にリクエストする場合、クラス内で複数の生徒が同じ姓名を持つことは一般的ではない可能性があります。
Python インタプリタは、名前空間のおかげで、コード内の正確なメソッドまたは変数をより深く理解できます。その結果、その名前には、スペース (スコープに関連) や一意の識別子を示す名前などの追加情報が含まれます。
Python には以下の 4 種類の名前空間があります。
- 内蔵
- グローバル
- 同封
- 地元
これらの名前空間には有効期間があるため、Python インタプリタは必要に応じて名前空間を作成し、不要になった場合は削除します。
Python のさまざまなタイプの名前空間を理解しましょう。
組み込みの名前空間
その名前が示すように、これには、Python ですでに利用可能なすべての Python 組み込みオブジェクトの事前定義された名前が含まれています。次のコマンドを使用して、これらの名前をリストしてみましょう。
Python ターミナルを開き、次のコマンドを入力します。
指示 -
dir(__builtins__)
出力:
Javaで文字列を比較する
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'ModuleNotFoundError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'RecursionError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopAsyncIteration', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'WindowsError', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'breakpoint', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip']
組み込みの名前空間は、Python インタープリターの起動時に作成されます。これらは、Python インタプリタが終了すると終了します。
グローバル名前空間
グローバル名前空間は、メイン プログラムの任意のレベルの Python の任意の名前で構成されます。これは本体の実行時に作成され、インタプリタが終了するまで存在し続けます。
Python インタープリターは、Python が import ステートメントでロードするモジュールのグローバル名前空間を作成します。詳細については、Python モジュールをご覧ください。
ローカルおよびそれを囲む名前空間
ローカル名前空間は関数によって使用されます。関数が実行されると、Python インタープリターは新しい名前空間を作成します。ローカル名前空間は、関数の実行が終了した後も存在し続けます。同様に、この機能は別の機能で構成することもできます。以下に示すように、ある関数を別の関数内で定義できます。
例 -
def f(): print('Initiate f()') def g(): print('Initiate g()') print('End g()') return g() print('Initiate f()') return f()
上記のモデルでは、機能 g() は f() のコレクション内で特徴付けられます。 f() 内で g() 関数とメインの f() 関数を呼び出しました。上記の関数がどのように機能するかを見てみましょう。
- Python は、 f() を呼び出すと、そのための新しい名前空間を作成します。
- 同様に、f() は g() を呼び出し、g() は独自の異なる名前空間を取得します。
- ローカル名前空間 g() は、それを囲む名前空間 f() 用に作成されました。
これらの各名前空間は、関数が終了すると終了します。
オブジェクト/変数のスコープ
「スコープ」という用語は、特定の Python オブジェクトのどのコーディング領域にアクセスできるかを指定します。すべてのオブジェクトと変数には、その変数にアクセスできるプログラム内のスコープがあります。たとえば、関数変数には関数内でのみアクセスできます。次の図を見てみましょう。
例 -
def scope_func(): print('Inside scope_func') def scope_inner_func(): var = 20 print('Inside inner function, value of var:',var) scope_inner_func() print('Try printing var from outer function: ',var) scope_func()
出力:
Inside scope_func Inside inner function, value of var: 20 Traceback (most recent call last): File 'd:/Python Project/listproblems.py', line 343, in scope_func() File 'd:/Python Project/listproblems.py', line 342, in scope_func print('Try printing var from outer function: ',var) NameError: name 'var' is not defined
Python 名前空間辞書
前のチュートリアルでは、キーがオブジェクト名を表し、値が実際のオブジェクトを表す、名前空間が辞書のようなものであることについて説明しました。 Python は辞書として、グローバル名前空間とローカル名前空間の両方を使用します。グローバルおよびローカルの名前空間辞書へのアクセスは、Python の globals() メソッドと locals() メソッドによって可能になります。
globals() メソッド
globals() メソッドは、現在のグローバル名前空間辞書への参照を返します。これを使用して、グローバル名前空間内のオブジェクトにアクセスできます。以下の例を見てみましょう。
例 -
>>> type(globals()) >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': }
ご覧のとおり、多くの組み込みエントリが含まれています。 グローバル() 方法。オペレーティング システムや Python のバージョンによって異なる場合があります。次に、グローバル変数を定義して違いを観察してみましょう。
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20}
a = 20 を割り当てた後、新しいグローバル変数がグローバル名前空間ディクショナリに割り当てられます。辞書にアクセスするのと同じように、値にアクセスできます。以下の例を見てみましょう。
>>> a = 20 >>> globals() {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 20} >>> a 20 >>> globals()['a'] 20
globals() 関数を使用してディクショナリ値を変更できます。
>>> globals()['a'] = 100 >>> a 100
これで、 a の新しい値がグローバル ディクショナリに表示されます。
locals() 関数
Python は、globals() に似た locals() メソッドも提供しますが、代わりにローカル名前空間内のオブジェクトにアクセスします。次の例を見てみましょう。
例 -
>>> def func(a, b): ... str1 = 'Hello' ... loc = locals() ... print(loc) ... >>> func(10, 20) {'a': 10, 'b': 20, 'str1': 'Hello'}
func(10, 20) を呼び出すと、locals() は関数のローカル名前空間を表す辞書を返します。関数スコープでは、ローカル変数 str1 を定義しました。関数引数は func() に対してローカルであるため、ローカル名前空間には関数引数が含まれていました。
それにもかかわらず、ローカル people() 機能を呼び出すと、それは globals() 機能と同等に機能します。 globals() 関数と locals() 関数は若干異なります。 globals() 関数は、追加の変数を定義するだけでなく、戻り値も保存します。辞書には新しい変数とその値が含まれます。以下の例を見てください。
例 -
>>> glob_var = globals() >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'} >>> x = 100 >>> glob_var {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': , '__spec__': None, '__annotations__': {}, '__builtins__': , 'a': 100, 'func': , 'glob_var': {...}, 'x': 100, 'y': 'JavaTpoint'}
ここで、 glob_var グローバル名前空間辞書への参照です。新しい代入ステートメント バツ そして そして に登場した glob_var 辞書。
スコープ外の変数の変更
呼び出し環境では、関数は別の値を渡すことで引数を変更できますが、値を変更できない場合もあります。
不変の引数は関数によって変更できません。
変更可能な引数はその場で変更できますが、完全に再定義することはできません。
次のシナリオを理解してみましょう。
例 -
x = 20 def func(): x = 40 print(x) func() print(x)
出力:
40 20
グローバル変数 x = 20 を定義し、関数内でも同じ名前を付けます。 func() が実行されると、値が 40 の整数オブジェクトへの新しいローカル変数参照が作成されます。 関数() body の場合、代入ステートメントはグローバル オブジェクトに影響を与えません。
ただし、関数はローカル スコープ外で可変型のオブジェクトを変更できます。以下の例を理解してみましょう。
例 -
my_list = ['Hello', 'From', 'JavaTpoint'] def func(): my_list[1] = 'Welcome to' return my_list print(func())
my_list はリストであり、可変型です。 func() は、ローカル スコープ外であっても、my_list 内で変更できます。ただし、my_list を再割り当てしようとすると、新しいローカル オブジェクトが作成され、グローバル my_list は変更されません。以下の例を見てみましょう。
C++で順序付けされていないマップ
例 -
my_list = ['Hello', 'from', 'JavaTpoint'] def func(): my_list = ['A', 'B', 'C', 'D', 'E', ''] return my_list print(func())
出力:
['A', 'B', 'C', 'D', 'E']
結論
名前空間、その利用方法、変数の次数を考慮します。簡単な Python プログラムを使用して、多数の個別のオブジェクトを作成できます。複雑な Python プログラムでは、この数は 1,000 を超える場合があります。 Python 名前空間を使用すると、インタープリタがこれらのオブジェクトの名前を覚えやすくなります。