1. 函數嵌套:
在一個函數中定義了另外一個函數
def outer():
def inner():
print('inner')
print('outer')
inner()
outer()
inner() # 此句會出錯
函數有可見范圍,這就是作用域的概念
內部函數不能被外部直接使用,會拋NameError異常
2. 作用域
一個標識符的可見范圍,這就是標識符的作用域。一般常說的是變量的作用域
全局作用域(global):在整個程序運行環境中都可見
局部作用域:在函數、類等內部可見;局部變量使用范圍不能超過其所在的局部作用域
def fn1():
x = 1 # 局部作用域,在fn1內可見
def fn2():
print(x) # x可見嗎?
print(x) # x可見嗎?
global使用原則:
外部作用域變量會內部作用域可見,但也不要在這個內部的局部作用域中直接使用,因為函數的目的是為了封裝,盡量與外界隔離。
如果函數需要使用外部全局變量,請使用函數的形參傳參解決。
一句話:不用global,學習它就是為了深入理解變量作用域。
3. 閉包
自由變量:未在本地作用域中定義的變量。例如定義在內存函數外的外層函數的作用域中的變量。
閉包:出現在嵌套函數中,指的是內層函數引用到了外層函數的自由變量,就行成了閉包。很多語言都有這個概念,最熟悉的就是JavaScript