19 命名空間和作用域

2022-07-16 02:36:09 字數 1412 閱讀 6491

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 在記憶體管理那一章節時,我們曾...