名前空間の可変ドメイン

1、名前空間の名前空間

名前を格納する場所は、スタック領域の一部門です。あなたが名前空間を持っていたら、それはスタック領域に保存することができ
、同じ名前。
名前空間の詳細については、3つに分割されています

1.1ビルトイン名前空間

店舗名:ストアPythonインタプリタの内蔵名前
メモリスペースの生存期間:開始Pythonインタプリタが生成され、Pythonインタプリタが近いその後、破棄

例如:
>>> print	#内置函数print
<built-in function print>	#内存空间
>>> input
<built-in function input>

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

店舗名:長い関数が内で定義されていない、また構築され、そして残りはグローバル名前空間名ですとして
のpythonファイルの実行が生成され、ファイルはPythonの破壊を実行し終えた後:生存期間

import os

x=10
if 13 > 3:
    y=20
    if 3 == 3:
        z=30

func=函数的内存地址
def func():  #函数名对应的也是全局名称
    a=111
    b=222

class Foo:
    pass

1.3ローカル名前空間

店舗名:あなたはの過程で生成されたコードを実行するために、関数本体中の関数名を関数を呼び出す
生存期間を:関数を呼び出すときに、生存、関数呼び出しは、破壊を完了しています

def func(a,b):
    pass

func(10,1)  #每调用一次都会产生一个局部名称空间
func(11,12)
func(13,14)
func(15,16)

1.4名前空間のロード順序

ビルトイン名前空間>グローバル名前空間>ローカル名前空間

1.5破壊の順序

ビルトイン名前空間のローカル名前空間>グローバル名前空間>

優先順位1.6の名前を探します

層の検索によってアップ層の現在位置

	如果当前在局部名称空间:
	局部名称空间—>全局名称空间->内置名称空间
input=333

def func():
    input=444  #会优先找函数内的input参数,如果没有会去全局名称空间
   				#找,最后去内置名称空间找,如果都没有则报错
    print(input)

func()

もし、現在のグローバルな名前空間
のグローバルネームスペース-ビルトイン名前空間>

input=333
def func():
    input=444
func()
print(input)


示范1:
def func():
    print(x)
x=111

func()

示范2:名称空间的"嵌套"关系是以函数定义阶段为准,与调用位置无关
x=1
def func():
   print(x)


def foo():
    x=222
    func()

foo()

示范3:函数嵌套定义
input=111
def f1():
    def f2():
        # input=333
        print(input)
    input=222

    f2()


f1()


示范4:
x=111
def func():
    print(x) #
    x=222

func()




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

グローバルスコープ:組み込みの名前空間、グローバル名前空間
1、グローバル生存
2、グローバルな有効:すべての機能が共有されています

x=111

def foo():
    print(x,id(x))

def bar():
    print(x,id(x))

foo()
bar()

print(x,id(x))

ローカルスコープ:ローカル名前空間の名前
1、一時的な生存
2、部分的に有効:有効な関数内で

def foo(x):
    def f1():
        def f2():
            print(x)



LEGB  #查找顺序
L —— Local(function);函数内的名字空间
E —— Enclosing function locals;外部嵌套函数的名字空间(例如closure)
G —— Global(module);函数定义所在模块(文件)的名字空间
B —— Builtin(Python);Python内置模块的名字空间

# builtin
# global
def f1():
    # enclosing
    def f2():
        # enclosing
        def f3():
            # local
            pass

globleと非ローカル

示范1:
x=111

def func():
    x=222

func()
print(x)

示范2:如果再局部想要修改全局的名字对应的值(不可变类型),需要用global
x=111

def func():
    global x # 声明x这个名字是全局的名字,不要再造新的名字了
    x=222

func()
print(x)


示范3:
l=[111,222]
def func():
    l.append(333)

func()
print(l)


nonlocal(了解): 修改函数外层函数包含的名字对应的值(不可变类型)
x=0
def f1():
    x=11
    def f2():
        nonlocal x
        x=22
    f2()
    print('f1内的x:',x)

f1()



def f1():
    x=[]
    def f2():
        x.append(1111)
    f2()
    print('f1内的x:',x)

f1()

公開された16元の記事 ウォンの賞賛0 ビュー150

おすすめ

転載: blog.csdn.net/weixin_46466247/article/details/104973994