# 一 命名空間: 就是存放名字的地方
# 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 在記憶體管理那一章節時,我們曾...