1、作用域 如果一個變量在def內賦值,他被定位在這個函數內 如果一個變量在一個嵌套的def中賦值,對於嵌套的函數來說,它非本地的 如果在def之外賦值,他就是整個文件 2、在交互式模式下,其實是在一個名為__main__的模板內。 3、一個函數的內部的任何類型的賦值都會把一個名稱划定為本地的。這包括=語句,import中的模板名稱,def中的函數名稱,函數參數名稱等。如果在一個def中以任意方式賦值的名稱,他都將對於該函數是本地的。 注意:原處改變對象並不會把變量划分為本地變量。 4、變量名解析:LEGB原則 1變量名引用分為三個作用域進行查找:首先是本地,然后是函數內(如果有的話),之后是全局的,最后是內置的 2默認情況下,變量名賦值會創建或者改變本地變量 3全局聲明和非本地聲明將賦值的變量名映射到模板文件的內部作用域。 4當在函數中使用未認證的變量名時,python搜索4個作用域(本地作用域,之后是上一層次中的def或者lambda的本地作用域,之后是全局,最后是內置的)並且在第一處能找到這個變量的地方停下來,如果變量名在這個過程中沒有找到則會報錯。 5、內置作用域 內置作用域僅僅是一個名為builtins內置模板,要在import builtins才能使用 import builtins print(dir(builtins)) 6、全局變量 全局變量是位於模板文件內部的頂層的變量名 全局變量如果在函數內部被賦值的話,必須經過聲明 全局變量在函數的內部不經過聲明也可以被引用 7、工廠函數(閉合函數) 一個能夠記住嵌套作用變量的函數 例如: def maker(N): def action(X): return X**N return action f = maker(2) print(f(2)) #輸出9 8、這個例子需要思考: def f(): a = [] for i in range(5): a.append(lambda x ;i**x) return a t = f() print(t[0](2)) #輸出16 print(t[1](2),t[2](2)) #輸出16,16 解釋:因為for循環結束后,i的值是4,記住這個i=4,所以當調用時,x的值才被傳進來。 解決辦法是使用默認參數: def f(): a = [] for i in range(5): a.append(lambda x,i=i ;i**x) #這里的i等於這次循環時的i return a t = f() print(t[0](2)) #輸出0 print(t[1](2),t[2](2)) #輸出2,4 9、nonlocal使用舉例 def tester(start): state = start def nested(label): nonlocal state #如果沒有這個,下面的是state+=1不行的 print(label,state) state+=1 return nested