Python之命名空間與作用域

2021-10-08 08:04:27 字數 2706 閱讀 3355

2、命名空間的載入順序:

4、名字的查詢優先順序:

5、作用域

命名空間就是存放名字的地方,分為三種命名空間
# 因為是第乙個被載入的命名空間,存放的是內建的名字,如print\input\len等

# 生命週期: 伴隨直譯器的啟動而產生,隨直譯器的關閉則**(銷毀)

# 示例:

>>> print

# built-in內建

# 因為是第二個被載入的命名空間,檔案執行過程中存放的頂級的名字

# 生命週期: 伴隨python檔案的開始執行時產生,python檔案執行結束則銷毀(**)

# 示例:

x = 10

def func():

x = 111

print(x)

# 存放的是函式的形參、函式內定義的名字

# 生命週期: 伴隨呼叫函式時則產生,函式呼叫結束則銷毀(**)

# 示例:

def foo(x):

y=3

# python直譯器先啟動,因而首先載入的是:內建命名空間

# 執行test.py檔案,然後以檔案為基礎,載入全域性命名空間

# 在執行檔案的過程中如果呼叫函式,則臨時產生區域性命名空間

# 命名空間的載入順序:內建命名空間->全域性命名空間->區域性命名空間

# 從當前位置往外查詢:

# 如果當前是在區域性:區域性命名空間->全域性命名空間->內建命名空間

# 如果當前是在全域性:全域性命名空間->內建命名空間

# 示範1:

def func():

len = 222

func()

print(len) # len=222

# 命名空間可以理解為一層套一層的關係,問題是巢狀關係是在函式定義階段生成的,還是在函式呼叫階段生成的?

# 定義階段生成的!!!

x = 111

def foo():

print(x)

def bar(f):

x=222

f()bar(foo)

# 乙個非常重要的結論:命名空間的巢狀關係是函式定義階段(即掃瞄語法時)就固定死的,與函式的呼叫位置無關
x = 111

def func():

print(x)

x=2222

func()

# 練習

'''# x=0

def f1():

# x=1

def f2():

# x=2

print(x)

f2()

f1()

'''len = 111

def f1():

len=2222

def f2():

len=3333

f1()

f2()

# 按照名字作用範圍的不同可以將三個命名空間劃分為兩個區域:

# 全域性範圍/全域性作用域:內建命名空間+全域性命名空間

特點:全域性存活,全域性有效

# 區域性範圍/區域性作用域:區域性命名空間

特點:臨時存活,區域性有效

# 可以呼叫內建函式local()和globals()來分別檢視區域性作用域和全域性作用域的名字,檢視的結果都是字典格式。在全域性作用域檢視到的locals()的結果等於globals()

x = 10

def func(x): # x = 值10的記憶體位址

# x = 值10的記憶體位址

x = 20

func(x) # func(值10的記憶體位址)

print(x)

x = [11,22,33]

def func(x): # x = 列表[11,22,33]的記憶體位址

# x = 列表[11,22,33]的記憶體位址

# x=444444444444

x[0] = 66666

func(x) # func(列表[11,22,33]的記憶體位址)

print(x)

x = [11,22,33]

def func():

x[0] = 66666

func()

print(x)

x = 10

def func():

global x

x=22

func()

print(x)

# nonlocal x會從當前函式的外層函式開始一層層去查。找名字x,若是一直到最外層函式都找不到,則會報錯!!!nonlocal不會查全域性命名空間!!!

x = 10

def f1():

x=111

def f2():

nonlocal x

x=222

f2()

print(x)

f1()

print(x) # x = 222 ,x = 10

Python 命名空間與作用域

2.作用域 作用範圍 存放名字的地方,是對棧區的劃分,有了命名空間之後,就可以在棧區中存放相同的名字,詳細的,命名空間 存放的名字 存放的python直譯器內建的名字 存活週期 python直譯器啟動則產生,python直譯器關閉則銷毀 print in function print input i...

python命名空間與作用域

命名空間 存放名字的地方,是對棧區的劃分,有了命名空間之後,就可以在棧區中存放相同的名字。存放的名字 存放python直譯器內建的名字 例如,print input print input 存活週期 python直譯器啟動則產生,python直譯器關閉則銷毀 存放的名字 只要不是函式內定義 也不是內...

Python命名空間與作用域

作用域global與nonlocal 總結作用 命名空間可以使棧區中存放相同的名字,從而解決命名衝突 命名空間分為三種 內建命名空間 全域性命名空間 區域性命名空間 變數名a a 1 函式名func deffunc pass 類名myclass class myclass passdef func ...