07-03名前空間と対象範囲

[TOC]

名前空間

地元関係を結合/オブジェクト名のマッピングに保存されている名前空間。X = 3の場合、Pythonはオブジェクト3を格納するメモリ空間を割り当てる、次いでデルX名前空間に格納された3 Xとの関係を、バインディング名は、結合関係をクリアします。

プログラム実行中の3名までのためのスペースがあります

イラスト:パロディー19
07-03名前空間と対象範囲

1.1ビルトイン名前空間

それが格納するために使用されるロードされた名前空間であることが第一であるので、起動/シャットダウンおよび発生/復旧通訳のpythonを伴ういくつかの組み込みのような名前、組み込みの関数名

>>> max
<built-in function max> #built-in内建

イラスト:パロディー20
07-03名前空間と対象範囲

1.2グローバルネームスペース

Pythonのファイル/完成プロデュース/リサイクルの実行に始まり、第二は、名前空間に次の名前を格納される生成されたファイル名の実行中に、ロードされた名前空間になることです

import sys #模块名sys

x=1 #变量名x

if x == 1:
    y=2 #变量名y

def foo(x): #函数名foo
    y=1
    def bar():
        pass

Class Bar: #类名Bar
    pass    

イラスト:パロディー21
07-03名前空間と対象範囲

1.3ローカル名前空間

通話/終了機能に加えて、一時的に/回復が発生し、関数名内で定義された関数のパラメータは、名前空間に保存されます

def foo(x):
    y=3 #调用函数时,才会执行函数代码,名字x和y都存放于该函数的局部名称空间中

名前空間のロード順序は次のとおりです。 - >グローバル・ネームスペース - ビルトイン名前空間>ローカル名前空間、および名前を見つけ、3の1つの名前がスペースから見つけられなければならない、次の順序のために見て:ローカル名前空間 - >グローバル名前空間 - >組み込みの名前空間。

イラスト:パロディー22
07-03名前空間と対象範囲

2つのスコープ

2.1グローバルスコープとローカルスコープ

これは、2つのエリアに3つの名前空間の異なるスコープ名に応じて分割することができます。

  1. グローバルスコープ:位置グローバルネームスペース、ビルトイン名前空間名グローバルスコープに属しては、その範囲内のグローバル生存の名前は、任意の位置にすることができ、グローバルに有効な((削除されない限り、そうでない場合は、文書全体の実行中に生き残ります) )を使用します。

  2. ローカルスコープ:ローカル名前空間名に位置する地域に属しています。一時的な生存の範囲内の名前(関数は、関数呼び出しの放出終了後、呼び出されたときに一時的に生成される)、局所的に有効な(関数内でのみ使用することができます)。

イラスト:パロディー23
07-03名前空間と対象範囲

2.2スコープと名前検索の優先順位

その最初のグローバルスコープに行き、ローカル名前空間が見つからない見つけ、ローカルスコープ内の名前を検索し、開始位置がローカルスコープでは、最初に検索されます。最終的には、組み込みの名前空間見つけ、その後、見つからない、グローバルネームスペースを探します私たちは、それが例外をスローします発見していません

x=100 #全局作用域的名字x
def foo():
    x=300 #局部作用域的名字x
    print(x) #在局部找x
foo()#结果为300

そう、見つからない、グローバルネームスペースを見つけるために、そして内蔵の名前空間を見つける、グローバルスコープで名前を検索し、開始位置がグローバルスコープで、最後には例外がスローされます見つけることができませんでした

x=100
def foo():
    x=300 #在函数调用时产生局部作用域的名字x
foo()
print(x) #在全局找x,结果为100

ヒント:組み込み関数の地元の人々()およびグローバル()各ローカルスコープおよび結果を表示するには、グローバルスコープの名前を見るために辞書形式で呼び出すことができます。地元のグローバルスコープのビューの結果は()(グローバルに等しいです)

イラスト:パロディー24
07-03名前空間と対象範囲

Pythonはネストされた定義関数、名前に埋め込まれたルックアップ機能をサポートし、名前は、独自のローカルスコープを探すために優先順位を与え、その後、内側から層の範囲の外部のネストされた関数定義を探し、見つからないだろうグローバルスコープを探します

x=1
def outer():
    x=2
    def inner(): # 函数名inner属于outer这一层作用域的名字
        x=3
        print('inner x:%s' %x)

    inner()
    print('outer x:%s' %x)

outer() 
#结果为
inner x:3
outer x:2

関数内、どんなに多くの層のネストされたのは、不変の型の値は、あなたがグローバルなキーワードを使用する必要がある場合、関数内でグローバル名前空間名の値を変更するために、グローバルスコープの名前を表示することができます

x=1
def foo():
    global x #声明x为全局名称空间的名字
    x=2
foo()
print(x) #结果为2

場合可変型引数の値は、直接反応インビボ初期値に対する関数の値の変更、

num_list=[1,2,3]
def foo(nums):
    nums.append(5)

foo(num_list)
print(num_list)
#结果为
[1, 2, 3, 5]

多層入れ子関数のために、非ローカルキーワードを使用して外部のネストされた関数定義の範囲から名前として宣言することができる(非グローバル)

def  f1():
    x=2
    def f2():
        nonlocal x
        x=3
    f2() #调用f2(),修改f1作用域中名字x的值
    print(x) #在f1作用域查看x

f1()

# 结果
3

最も外側の関数へのすべての方法は、例外がスローされ、見つからない場合は非ローカルX機能は、名前xを見つけるために、現在の関数の外側の層から開始します。

イラスト:パロディー25
07-03名前空間と対象範囲

おすすめ

転載: blog.51cto.com/egon09/2461539