1. 函數(shù)嵌套:
在一個函數(shù)中定義了另外一個函數(shù)
def outer():
def inner():
print('inner')
print('outer')
inner()
outer()
inner()? ? # 此句會出錯
函數(shù)有可見范圍践惑,這就是作用域的概念
內(nèi)部函數(shù)不能被外部直接使用,會拋NameError異常
2. 作用域
一個標識符的可見范圍,這就是標識符的作用域宾舅。一般常說的是變量的作用域
全局作用域(global):在整個程序運行環(huán)境中都可見
局部作用域:在函數(shù)尝抖、類等內(nèi)部可見次伶;局部變量使用范圍不能超過其所在的局部作用域
def fn1():
x = 1? ? # 局部作用域婉支,在fn1內(nèi)可見
def fn2():
print(x)? # x可見嗎秉颗?
print(x)? ? ? ? # x可見嗎痢毒?
global使用原則:
外部作用域變量會內(nèi)部作用域可見,但也不要在這個內(nèi)部的局部作用域中直接使用蚕甥,因為函數(shù)的目的是為了封裝哪替,盡量與外界隔離。如果函數(shù)需要使用外部全局變量菇怀,請使用函數(shù)的形參傳參解決凭舶。不用global,學習它就是為了深入理解變量作用域爱沟。
3. 閉包
自由變量:未在本地作用域中定義的變量帅霜。例如定義在內(nèi)存函數(shù)外的外層函數(shù)的作用域中的變量。
閉包:出現(xiàn)在嵌套函數(shù)中呼伸,指的是內(nèi)層函數(shù)引用到了外層函數(shù)的自由變量身冀,就行成了閉包。很多語言都有這個概念蜂大,最熟悉的就是JavaScript