def three_max(a, b, c): t = two_max(a, b) # 函數嵌套調用two_max return t if t > c else c def two_max(a, b): return a if a > b else b print(three_max(1, 2, 3))
程序執行,按照從下往下的順序,把變量、函數名加入到命名空間,若是還未加入到命名空間,就調用了函數,將會報錯。函數
如上程序,若是把three_max的調用,交換到two_max的前面,將會報錯:NameError: name 'two_max' is not definedspa
def three_max(a, b, c): t = two_max(a, b) # 函數嵌套調用two_max return t if t > c else c print(three_max(1, 2, 3)) # NameError: name 'two_max' is not defined def two_max(a, b): return a if a > b else b
a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): a = 3 print("inner2:", a) # 3 inner2() print("inner:", a) # 2 inner() print("outer:", a) # 1 outer() print(a)
嵌套定義時,每一個局部都有本身的命名空間,互相不干擾code
子函數定義了和父函數相同的變量,其值都爲獨立的,修改不影響父函數blog
a = 1 def outer(): a = 1 def inner(): a = 2 def inner2(): global a # 修改的是全局的變量數據 a = 3 print("inner2:", a) # 3 inner2() print("inner:", a) # 2 inner() print("outer:", a) # 1 outer() print(a) # 3
global定義的變量,是全局命名空間的變量three
不影響局部的變量內存
a = 1 def outer(): # nonlocal a # 只能對局部做用域變量有效,在最後一個局部報錯SyntaxError: no binding for nonlocal 'a' found a = 1 def inner(): # nonlocal a a = 2 def inner2(): nonlocal a a = 3 print("inner2:",a) # 3 inner2() print("inner:", a) # 3 nonlocal找到上一層的變量進行了更改 inner() print("outer:", a) # 1 outer() print(a) # 定義nonlocal後,全局變量不變依然爲1
nonlocal尋找離當前函數最近的一層局部變量作用域
聲明瞭nonlocal的局部變量的改動,會影響最近一層的函數的局部變量class
一、函數名就是函數的內存地址,能夠直接賦值;容器
二、函數名能夠做爲容器的元素;變量
三、函數名能夠做爲參數;
四、函數名能夠做爲返回值;
def func(): print(123) # 函數名就是函數地址,能夠直接賦值 f1 = func f1() # 函數名能夠作爲容器的元素 l = [func, f1] for i in l: i() # 函數名能夠做爲參數 # 函數名能夠做爲返回值 def func2(f): f() return f # 函數名做爲返回值 f2 = func2(func) # 函數名做爲參數 f2()