26 命名空間和作用域

2021-10-08 07:47:50 字數 2188 閱讀 2963

# 一 命名空間: 就是存放名字的地方

# 1 內建命名空間: 存放的是內建的名字,如print\input\len

# 生命週期: 直譯器啟動則產生,直譯器關閉則銷毀

# 2 全域性命名空間: 存放的是頂級的名字

# 生命週期: python程式執行時則產生,python程式結束則銷毀

x =10

deffunc()

: x =

111print

(x)if1:

y =6666

# 3 區域性命名空間:函式內的名字

# 生命週期: 呼叫函式時則產生,函式呼叫結束則銷毀

# 名字的查詢優先順序:

# 從當前位置往外查詢,如果當前是在區域性:區域性命名空間->全域性命名空間->內建命名空間

# 從當前位置往外查詢,如果當前是在全域性:全域性命名空間->內建命名空間

# 示範1:

deffunc()

:len

=222

print

(len

)len

=111

func(

)print

(len

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

x =111

deffoo()

:print

(x)def

bar(f)

: x =

222 f(

)bar(foo)

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

x =111

deffunc()

:print

(x) x =

2222

func(

)# 練習

'''# x=0

def f1():

# x=1

def f2():

# x=2

print(x)

f2()

f1()

'''len

=111

deff1()

:len

=2222

deff2()

:len

=3333

f1()

f2()

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

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

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

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

# 了解:

# global(****)

# nonlocal(***)

# 案例1

x =10

deffunc

(x):

# x = 值10的記憶體位址

# x = 值10的記憶體位址

x =20func(x)

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

print

(x)# 案例2

x =[11,

22,33]

deffunc

(x):

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

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

# x=444444444444

x[0]=

66666

func(x)

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

print

(x)# 案例3

x =[11,

22,33]

deffunc()

: x[0]

=66666

func(

)print

(x)# 案例4

x =10

deffunc()

:global x

x =22func(

)print

(x)# 案例5:nonlocal生命名字是來自於外層函式的(***)

x =10

deff1()

: x =

111deff2(

):nonlocal x

x =222 f2(

)print

(x)f1(

)print

(x)

命名空間和作用域

1 命名空間查詢順序 假設我們要使用變數 runoob,則 python 的查詢順序為 直譯器會從命名空間中查詢runoob,它先從區域性空間查詢,如果找到了它就會使用區域性命名空間的變數runoob,即使全域性命名空間也有變數runoob。這就很容易理解為什麼在函式內部宣告的區域性變數會覆蓋掉在模...

命名空間和作用域

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

命名空間和作用域

函式內部的函式只能在函式內部呼叫,不能在函式外部呼叫,通過接下來的學習你將會知道為什麼會出現這種情況。def f1 def f2 print from f2 f2 f2 nameerror name f2 is not defined 命名空間 name spaces 在記憶體管理那一章節時,我們曾...