命名空間:就是存放名字和物件對映/繫結關係的地方(存放名字的空間)
如果你想訪問乙個變數值,必須先訪問對應的命名空間拿到名字和對應的記憶體位址的繫結位址
python提前給你定義完的名字,就是存在內建命名空間,比如內建函式名
>>> max
>>>
>>> print
>>>
>>> input
存放於檔案級別的名字,就是全域性命名空間
if、while、for內部定義的名字執行之後都存放於全域性命名空間
函式內部定義的所有名字都市存放於當前函式的內建命名空間
def foo(x):
y = 1 #呼叫函式時,才會執行函式**,名字x和y都存放於該函式的區域性命名空間中
命名空間的順序
函式內部使用的名字,定義階段已經規定死了,與呼叫位置無關
生命週期
在python直譯器啟動的時候生效,關閉直譯器的時候失效
當你啟動當前這個py檔案的時候生效,當頁面**執行結束之後失效
當你呼叫當前函式時生效,函式體最後一行**執行結束之後失效
按照名字作用範圍的不同可以將三個命名空間劃分為兩個區域:
位於全域性命名空間、內建命名空間中的名字屬於全域性範圍,該範圍內的名字全域性存活(除非被刪除)、全域性有效(在任意位置都可以使用)
【全域性可以呼叫的名字就存放於全域性作用域】【內建命名空間+全域性命名空間】
x = 100
def foo():
x = 300 #函式呼叫時產生區域性作用域的名字x
foo()
print(x) #在全域性找x,結果為100
在全域性作用域查詢名字時,先查詢全域性命名空間,沒有找到,再查詢內建命名空間,最後都沒有找到就會丟擲異常
位於區域性命名空間中的名字屬於區域性範圍。該範圍內的名字臨時存活(在函式呼叫時臨時生成,函式呼叫結束後釋放)、區域性有效(只能在函式內使用)
【區域性可以呼叫的名字就存放於區域性作用域】【區域性命名空間】
x = 100 #全域性作用域的名字x
def foo():
x = 300 #區域性作用域的名字x
print(x) #在區域性找x
foo() #結果為300
在區域性作用域查詢名字時,先查詢全域性命名空間,沒有找到,再查詢內建命名空間,最後都沒有找到就會丟擲異常
宣告全域性變數
x = 1
def foo():
global x #宣告x為全域性命名空間的名字
x = 2
foo()
print(x)
2
在區域性命名空間宣告區域性變數,在區域性修改上層函式的變數
只有可變型別可以在區域性修改外部變數的值
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2() #呼叫f2(),修改f1作用域中名字x的值
print(x) #在f1作用域檢視x
f1()
3
nonlocal x 會從當前函式的外層函式開始一層層去檢視名字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 在記憶體管理那一章節時,我們曾...