検索

平たく言えば、Python のいわゆる名前空間はコンテナとして理解できます。このコンテナには多くの識別子を保持できます。異なるコンテナ内にある同じ名前の識別子は、互いに競合しません。 Python の名前空間を理解するには、次の 3 つのルールをマスターする必要があります:

まず、 割り当て (明示的な割り当てと暗黙的な割り当てを含む) によって識別子が生成され、割り当ての場所によって識別子が配置される名前空間 が決まります。

2 番目に、 関数定義 (def と lambda を含む) は新しい名前空間 を生成します。

3 番目、Python が識別子を検索する順序は「LEGB」です。

いわゆる「LEGB」は、Python の 4 層の名前空間の英語名の略称です。
最内層はL(ローカル)であり、関数定義内にあることを意味しており、この関数には関数定義が含まれていない。
2 番目の層 E (囲み関数) は関数定義で表現されますが、この関数には関数の定義も含まれています。実際には、L 層と E 層は相対的なものにすぎません。
3 番目の層 G (グローバル) は、モジュールの名前空間、つまり、関数ではなく .py ファイルで定義された識別子を参照します。
4 番目のレイヤー B (builtin) は、Python インタープリターの開始時にすでに使用可能な名前空間を指します。これは、Python インタープリターの開始時に __builtin__ モジュールが自動的にロードされるため、このモジュールのリストと str が組み込まれています。 in 関数はレイヤー B の名前空間にあります。

これら 3 つのルールは、例を通してさらに明確になります。次の例に示すように:

>>> g = int('0x3', 0)
>>> def outFunc():
  e = 2
    g = 10
  def inFunc():
     l = 1
     return g + e
    return inFunc()
>>> outFunc() ===> 12

このコードの識別子を詳しく見てみましょう。
1 行目では、最初のルール「代入により識別子が生成される」が適用され、識別子 g が生成されます。 「割り当ての場所によって、識別子が配置される名前空間が決まります。 g は関数定義にないため、g は 'G' 層名前空間にあります。」この行には int という別の識別子があります。では、int はどこで定義されているのでしょうか? int は組み込み関数であり、__builtin__ モジュールで定義されているため、int は 'B' のレイヤー名前空間にあります。
行 2 は最初のルールを適用します。 def には暗黙的な割り当てプロセスが含まれているため、この行では outFunc が関数定義内にありません。したがって、outFunc は 'G' 層の名前空間にあります。さらに、この行は 2 番目のルールも適用し、新しい名前空間を作成します。
行 3 では、最初のルールを適用して識別子 e を生成します。これは関数定義内にあり、内部に関数定義があるため、e は「E」レイヤー名前空間内にあります。
4 行目では、最初のルールが適用され、識別子 g が生成されます。これは、e のような「E」層名前空間の外側にあることに注意してください。この g は、名前空間が異なるため、最初の行の g とは異なります。
5 行目では、最初のルールを適用し、「E」層名前空間に識別子 inFunc を生成します。行 2 と同様、関数を定義するこの行でも新しい名前空間が作成されます。
行 6 は最初のルールを適用し、識別子 l を生成します。この l は関数内にあり、この関数内には他の関数が定義されていないため、l は「L」レイヤー名前空間にあります。
7 行目、3 番目のルールが適用されます。Python インタプリタは最初に識別子 g を確認し、LEGB の順序で検索し、最初に L 層 (つまり、inFunc 内) を探しますが、見つかりません。レイヤー E を再度検索します。レイヤー E が 1 つあり、値は 10 です。したがって、ここでの g の値は 10 です。検索プロセスが終了すると、「G」レイヤーはそれ以上見つかりません。 e を求めるプロセスは同じで、e の値は 2 です。したがって、9 行目の結果は 12 になります。

実際、いわゆる「LEGB」は学術的な表現を容易にするために作成されました。 Python が識別子の値を見つける方法を知っている限り、プログラマがどの識別子がどのレベルにあるかを伝えることは意味がありません。実際、価値を見つけるプロセスは直感的に理解しやすいです。

上記の例からわかるように、同じ識別子が異なる名前空間で定義されていても問題はなく、競合は発生しません。識別子の値を見つけるプロセスは常に現在のレイヤーから開始され、最初に検出されるのは識別子の値です。 「B」層識別子はすべてのモジュール (.py ファイル) で使用可能であり、「G」層識別子は現在のモジュール (.py ファイル) 内で使用可能であるとも言えます。識別子は現在の関数内で使用できます。

グローバルステートメントの使用法を説明するために別の例を見てみましょう。コードは次のようになります:

>>> g = 'global'
>>> s = 'in'
>>> def out():
    g = 'out'
    def inter():
     global g     
     print s,g
  inter()
>>> out() ===> 'in global'

レイヤー内に g が 2 つありますが、global ステートメントを使用すると、「G」レイヤーの識別子を参照していることがわかります。つまり、7 行目の g は 1 行目で生成された g を参照し、その値は「global」です。

最後に、プログラミング時に注意を払い、同じ識別子を使用しない限り、基本的に名前空間に関連する問題は回避できます。また、関数内の上位レベルの名前空間では識別子を使用しないようにしてください。識別子を使用する必要がある場合は、関数の独立性を維持するのに役立つパラメーターの受け渡しを使用することをお勧めします。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
详细讲解Python之Seaborn(数据可视化)详细讲解Python之Seaborn(数据可视化)Apr 21, 2022 pm 06:08 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。

详细了解Python进程池与进程锁详细了解Python进程池与进程锁May 10, 2022 pm 06:11 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于进程池与进程锁的相关问题,包括进程池的创建模块,进程池函数等等内容,下面一起来看一下,希望对大家有帮助。

Python自动化实践之筛选简历Python自动化实践之筛选简历Jun 07, 2022 pm 06:59 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于简历筛选的相关问题,包括了定义 ReadDoc 类用以读取 word 文件以及定义 search_word 函数用以筛选的相关内容,下面一起来看一下,希望对大家有帮助。

归纳总结Python标准库归纳总结Python标准库May 03, 2022 am 09:00 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于标准库总结的相关问题,下面一起来看一下,希望对大家有帮助。

分享10款高效的VSCode插件,总有一款能够惊艳到你!!分享10款高效的VSCode插件,总有一款能够惊艳到你!!Mar 09, 2021 am 10:15 AM

VS Code的确是一款非常热门、有强大用户基础的一款开发工具。本文给大家介绍一下10款高效、好用的插件,能够让原本单薄的VS Code如虎添翼,开发效率顿时提升到一个新的阶段。

python中文是什么意思python中文是什么意思Jun 24, 2019 pm 02:22 PM

pythn的中文意思是巨蟒、蟒蛇。1989年圣诞节期间,Guido van Rossum在家闲的没事干,为了跟朋友庆祝圣诞节,决定发明一种全新的脚本语言。他很喜欢一个肥皂剧叫Monty Python,所以便把这门语言叫做python。

Python数据类型详解之字符串、数字Python数据类型详解之字符串、数字Apr 27, 2022 pm 07:27 PM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于数据类型之字符串、数字的相关问题,下面一起来看一下,希望对大家有帮助。

详细介绍python的numpy模块详细介绍python的numpy模块May 19, 2022 am 11:43 AM

本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于numpy模块的相关问题,Numpy是Numerical Python extensions的缩写,字面意思是Python数值计算扩展,下面一起来看一下,希望对大家有帮助。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境