函式內部的函式只能在函式內部呼叫,不能在函式外部呼叫,通過接下來的學習你將會知道為什麼會出現這種情況。
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
# 作用域應用
def f1():
def inner():
print('from inner')
return inner
f = f1() # 把區域性定義的函式放在全域性之中
def bar():
f()bar()
from inner
修改全域性作用域中的變數。
x = 1
def f1():
x = 2
def f2():
# global x # 修改全域性
x = 3
f2()
f1()
print(x)
1
x = 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()
2
x = 1
def f1():
x = 2
def f2():
nonlocal x
x = 3
f2()
print(x)
f1()
3
lis =
def f1():
print(f"呼叫函式前: ")
f1()
print(f"呼叫函式後: ")
呼叫函式前:
呼叫函式後: [1]
命名空間和作用域
1 命名空間查詢順序 假設我們要使用變數 runoob,則 python 的查詢順序為 直譯器會從命名空間中查詢runoob,它先從區域性空間查詢,如果找到了它就會使用區域性命名空間的變數runoob,即使全域性命名空間也有變數runoob。這就很容易理解為什麼在函式內部宣告的區域性變數會覆蓋掉在模...
命名空間和作用域
命名空間是對棧區的劃分,存放名字的地方.有了命名空間之後,就可以在棧區中存放相同的名字 存放的名字 存放的python直譯器內建的名字 存活週期 python直譯器啟動則產生,python直譯器關閉則銷毀 print input 存放的名字 只要不是函式內定義 也不是內建的,剩下的都是全域性命名空間...
命名空間和作用域
命名空間 就是存放名字和物件對映 繫結關係的地方 存放名字的空間 如果你想訪問乙個變數值,必須先訪問對應的命名空間拿到名字和對應的記憶體位址的繫結位址 python提前給你定義完的名字,就是存在內建命名空間,比如內建函式名 max print input 存放於檔案級別的名字,就是全域性命名空間 i...