目錄
命名空間(掌握)
內建命名空間
全域性命名空間
區域性命名空間
載入順序
查詢順序
作用域(掌握)
全域性作用域
區域性作用域
注意點函式物件+作用域應用
補充知識點(了解)
global關鍵字
nonlocal關鍵字
注意點函式內部的函式只能在函式內部呼叫,不能在函式外部呼叫,通過接下來的學習你將會知道為什麼會出現這種情況。
def f1():
def f2():
print('from f2')
f2()
f2() # nameerror: name 'f2' is not defined
命名空間(name spaces):在記憶體管理那一章節時,我們曾說到變數的建立其實就是在記憶體中開闢了乙個新的空間。但是我們一直在迴避變數名的儲存,其實在記憶體中有一塊記憶體儲存變數名與變數間的繫結關係的空間,而這個空間稱為命名空間。
內建命名空間:存放pyhton直譯器自帶的名字,如int、float、len
生命週期:在直譯器啟動時生效,在直譯器關閉時失效
全域性命名空間:除了內建和區域性的名字之外,其餘都存放在全域性命名空間,如下面**中的x、func、l、z
生命週期:在檔案執行時生效,在檔案執行結束後失效
x = 1
def func():
pass
l = [1, 2]
if 3 > 2:
if 4 > 3:
z = 3
區域性命名空間:用於存放函式呼叫期間函式體產生的名字,如下面**的f2
生命週期:在檔案執行時函式呼叫期間時生效,在函式執行結束後失效
def f1():
def f2():
print('from f2')
f2()
f1()
由於.py檔案是由python直譯器開啟的,因此一定是在python直譯器中的內建命名空間載入結束後,檔案才開始開啟,這個時候才會產生全域性命名空間,但檔案內有某乙個函式被呼叫的時候,才會開始產生區域性命名空間,因此命名空間的載入順序為:內建--》全域性--》區域性。
由於命名空間是用來存放變數名與值之間的繫結關係的,所以但凡要查詢名字,一定是從三者之一找到,查詢順序為:
從當前的所在位置開始查詢,如果當前所在的位置為區域性命名空間,則查詢順序為:區域性--》全域性--》內建。
x = 1
y = 2
len = 100
def func():
y = 3
len = 1000
print(f"y: ")
print(f"len: ")
# print(a) # nameerror: name 'a' is not defined
func()
y: 3
len: 1000
x = 1
def func():
print(x)
x = 10
func()
10域指的是區域,作用域即作用的區域。
全域性作用域:全域性有效,全域性存活,包含內建命名空間和全域性命名空間。
# 全域性作用域
x = 1
def bar():
print(x)
bar()
1區域性作用域:區域性有小,臨時儲存,只包含區域性命名空間。
# 區域性作用域
def f1():
def f2():
def f3():
print(x)
x = 2
f3()
f2()
f1()
2需要注意的是:作用域關係在函式定義階段就固定死了,與函式的呼叫無關。
# 作用域注意點
x = 1
def f1(): # 定義階段x=1
print(x)
def f2():
x = 2
f1()
f2()
1修改全域性作用域中的變數。
x = 1
def f1():
x = 2
def f2():
# global x # 修改全域性
x = 3
f2()
f1()
print(x)
1x = 1
def f1():
x = 2
def f2():
global x # 修改全域性
x = 3
f2()
f1()
print(x)
3修改區域性作用域中的變數。
x = 1
def f1():
x = 2
def f2():
# nonlocal x
x = 3
f2()
print(x)
f1()
2x = 1
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2()
print(x)
f1()
3
命名空間與作用域
命名空間即存放名字與物件對映 繫結關係的地方。對於x 3,python會申請記憶體空間存放物件3,然後將名字x與3的繫結關係存放於命名空間中,del x表示清除該繫結關係。在程式執行期間最多會存在三種命名空間 伴隨python直譯器的啟動 關閉而產生 因而是第乙個被載入的命名空間,用來存放一些內建的...
命名空間與作用域
定義 它是儲存作用域中變數的字典。乙個命名空間中不能有重名,但是不同的命名空間可以重名而沒有任何影響。分類 按照變數定義的位置,可以劃分為以下3類 local,區域性命名空間,記錄了函式中定義的所有變數,包括函式的入參 內部定義的區域性變數。使用locals 檢視區域性命名空間。返回的是字典 glo...
命名空間與作用域
有了命名空間之後,就可以在棧區中存放相同的名字,詳細的命名空間 存放的名字 內建命名空間存放的是python直譯器自帶的名字 例如 print input 生命週期 py直譯器啟動則產生,直譯器關閉則銷毀 存放的名字 只要不是內建的和函式內定義的名字,都是全域性命名空間 生命週期 python檔案執...