関数の基礎 - 名前空間とスコープ

関数は、関数内のみの関数呼び出しの内部では、関数?!外に呼び出すことはできません
理由:名前空間の問題!!!

ディアン名前空間

名前空間(ネームスペース):いつ章、我々は変数が実際にメモリに新たなスペースを開いている作成すると述べたメモリ管理。しかし、我々は、実際には、メモリ内の変数名と変数のメモリストレージ間の結合関係の余地がある、変数名を格納避けてきた、この空間は、名前空間と呼ばれています。

1.1ビルトイン名前空間

内蔵の名前空間:名前が付いていますストアPyhtonインタプリタは、そのようなint型、float型、LENとして

ライフサイクル:インタプリタを有効にするために始めたとき、インタプリタが閉じているときに、失敗

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

グローバル・ネームスペース:内部およびローカル名に加えて、残りは次のコードのように、グローバルネームスペースに格納されている
x、func、l、z
ライフサイクル:ファイルが実行されるときに有効になり、ファイルは、実行後に期限切れ

x = 1

def func():
    pass

l = [1, 2]

if 3 > 2:
    if 4 > 3:
        z = 3

1.3ローカル名前空間

ローカル名前空間:関数呼び出しの際に生成された格納するための関数本体の名前は、そのような次のコードF2など

ライフサイクル:ファイルが実行されると、関数呼び出しの際に有効になる機能の実行後に期限切れ

def f1():
    def f2():
        print('from f2')
    f2()

f1() 

1.4ロード順序

Pythonインタプリタでの名前空間のロードが完了した後に、それが構築されなければならないので、の.pyファイルは、Pythonインタプリタによって開かれているので、ファイルを開くために始めた、この時間は、グローバルな名前空間を演出しますが、特定の関数がファイルにあり - 「グローバル - 」ローカルビルトイン:呼び出されたとき、それはロード順序のローカル名前空間、名前空間を生成するために開始されます。

1.5の順序を探します

名前空間は、変数名と値の間の結合関係を格納するために使用されているので、あなたが名前を見つけたい時はいつでも、次の順序を探し、3の1に記載されていなければなりませんよう:
現在の場所ならば、現在の場所から見始めます- 「世界- 」建てローカル:ローカルネームスペースの場所は、次の順序を探します。

x = 1
y = 2
len = 100

def func():
    y = 3
    len = 1000
    print(f"y: {y}")
    print(f"len: {len}")
    # print(a)  # NameError: name 'a' is not defined

func()

y: 3 len: 1000

x = 1

def func():
    print(x)

x = 10
func()

二ディアン範囲

ドメインは、すなわち作用領域範囲領域を指します。

2.1グローバルスコープ

グローバルスコープ:グローバル・効果的な、世界的な生存、および組み込みの名前空間のグローバルネームスペース。

# 全局作用域
x = 1

def bar():
    print(x)

bar()

1

2.2ローカルスコープ

ローカルスコープ:ローカル小さな、一時保管、唯一のローカルな名前空間を含みます。

# 局部作用域
def f1():
    def f2():
        def f3():
            print(x)
        x = 2
        f3()
    f2()

f1()

2

2.3 注意点

なお:関数定義ステージ固定金型との間の関係の範囲に関係なく、関数の呼ばれました。

# 作用域注意点
x = 1

def f1():  # 定义阶段x=1
    print(x)

def f2():
    x = 2
    f1()

f2()

1

スコープの関数オブジェクトの2.4応用+

# 作用域应用
def f1():
    def inner():
        print('from inner')
    return inner

f = f1()  # 把局部定义的函数放在全局之中

def bar():
    f()

bar()

from inner


水とサプリメントの知識

3.1グローバルキーワード

グローバルスコープ内の変数を変更します。

x = 1

def f1():
    x = 2

    def f2():
        #         global x  # 修改全局
        x = 3
    f2()

f1()
print(x)

1

x = 1

def f1():
    x = 2
    def f2():
        global x  # 修改全局
        x = 3
    f2()

f1()
print(x)

3

3.2非ローカルキーワード

変数にローカルスコープを変更します。

x = 1

def f1():
    x = 2
    def f2():
        #         nonlocal x
        x = 3

    f2()
    print(x)

f1()

2

x = 1

def f1():
    x = 2
    def f2():
        nonlocal x
        x = 3

    f2()
    print(x)

f1()

3

3.3 注意点

 地元1.任意のステートメントを直接変更することができます必要としない、グローバル変数の型を変更したいです。
 2.ローカル不変タイプのあなたは、世界的なステートメントを使用する必要性をグローバル変更したい場合は、グローバル変数を直接変更することができますように、宣言しました。

lis = []

def f1():
    lis.append(1)

print(f"调用函数前: {lis}")
f1()
print(f"调用函数后: {lis}")

调用函数前: [] 调用函数后: [1]

おすすめ

転載: www.cnblogs.com/suren-apan/p/11374798.html
おすすめ