1.載入順序
內建命名空間》全域性命名空間》區域性命名空間
2.銷毀順序
區域性命名空間》全域性命名空間》內建命名空間
#內建命名空間
#全域性命名空間
#區域性命名空間
#例:如果當前在全域性命名空間:
#全域性命名空間-->內建命名空間
例1:起始位置是區域性作用域,所以先查詢區域性空間
x=100 #全域性作用域的名字x
def foo():
x=300 #區域性作用域的名字x
print(x) #在區域性找x
foo()#結果為300
例2:起始位置是全域性,先在全域性命名空間查詢
x=100
def foo():
x=300 #在函式呼叫時產生區域性作用域的名字x
foo()
print(x) #在全域性找x,結果為100
例3:命名空間的巢狀關係是以函式定義階段為準,與呼叫位置無關
def func():
print(x)
x=111
func()
命名空間的巢狀關係決定名字的查詢順序
而命名空間的巢狀關係是以函式定義階段為準的
即函式的巢狀關係與名字的查詢順序是在定義階段就已經確定好的
全域性作用域:內建命名空間、全域性命名空間
1.全域性存活
2.全域性有效:被所有函式共享
1.臨時存活
2.區域性有效:函式內有效
#built-in
#global
def f1():
#enclosing
def f2():
#enclosing
def f3():
#local
pass
#如果要在區域性想要修改全域性的名字對應的值(不可變型別),需要用global
x=111
def func():
global x #宣告x這個名字是全域性的名字,不要再造新的名字了
x=222
func()
print(x)
#修改函式外層函式包含的名字對應的值(不可變型別),若一直到最外層函式都找不到修改值,則會報錯
def f1():
x=2def f2():
nonlocal x
x=3f2() #呼叫f2(),修改f1作用域中名字x的值
print(x) #在f1作用域檢視x
f1()
#結果3
命名空間和作用域
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 在記憶體管理那一章節時,我們曾...