python之函数名称空间,作用域,嵌套函数
生活随笔
收集整理的這篇文章主要介紹了
python之函数名称空间,作用域,嵌套函数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 嵌套函數
- 定義
- 名稱空間的三大類(只存變量名)
- 名稱空間加載順序
- 變量名的查找順序為
- 作用域
嵌套函數
定義
函數內部定義的函數,無法在函數外部使用內部定義的函數。
def f1():def f2():print('from f2')f2()f2() # NameError: name 'f2' is not defineddef f1():def f2():print('from f2')f2()f1()''' from f2 '''名稱空間的三大類(只存變量名)
內置名稱空間
- 定義:python解釋器自帶的方法,如:int,float,len等。==類似小整數池==
- 生命周期:在python解釋器啟動時,就開始生效。直到python解釋器關閉
全局名稱空間
定義:除了內置和局部的名字之外,其余都存在全局名稱空間。如下面的代碼x,func,z
x = 1def func():passif x > 11:z = 20000 else:z = 555 print(z)生命周期:在文件執行時生效,文件執行完后失效
局部名稱空間
定義:在函數內部的都叫局部,也就是說在函數內部定義的變量 就是局部變量。如下圖的x ,f2等等
def test_one():x = 1def max_num():print("from max_num")max_num()test_one()生命周期:在調用函數時生效,當函數執行結束后失效
名稱空間加載順序
內置名稱空間 --> 全局名稱空間 --> 局部名稱空間
變量名的查找順序為
局部名稱空間 --> 全局名稱空間 --> 內置名稱空間
作用域
全局作用域
定義:全局有效,全局存活,包含內置名稱空間和全局名稱空間.如x,test_one
x = 1def test_one():print(x)test_one()
局部作用域
定義:局部有效,臨時存儲,只包含局部名稱空間。如x
def test_one()x = 1print(x)test_one()
PS:當局部名稱空間沒有對應的變量時,系統會自動去全局名稱空間查找。沒有找到就會報錯。
# 第一種情況 x = 1 def one():print(x)def two():x = 10one() two()''' 1 '''# 第二種情況 x = 1 def one():x = 10print(x)def two():x = 5one()two()''' 10 ''''''總結:對于第一種情況,程序調用了two函數,在two函數中調用了one函數,而one函數中沒有定義x變量,對于one函數而言,它屬于局部名稱空間,變量x既然沒有定義,那么就直接去上一級找,因此x=1對于第二種情況,one函數中定義了x變量,因此直接使用即可,所以x=10'''函數對象+作用域應用
補充知識點
global關鍵字:修改全局作用域中的變量
x = 1def f1():x = 2def f2():# global x # 修改全局x = 3f2()f1() print(x)''' 1 '''x = 1def f1():x = 2def f2():global x # 修改全局x = 3f2()f1() print(x)''' 3 '''nonlocal關鍵字
x = 1def f1():x = 2def f2():# nonlocal xx = 3f2()print(x)f1()''' 2 '''x = 1def f1():x = 2def f2():nonlocal xx = 3f2()print(x)f1()''' 3 '''注意
在局部名稱空間中想要修改全局的可變類型,不需要任何聲明,可以直接修改
lis = []def f1():lis.append(1)print(f"調用函數前: {lis}") f1() print(f"調用函數后: {lis}")在局部如果想要修改全局的不可變類型,需要借助global聲明,聲明為全局的變量,即可直接修改
轉載于:https://www.cnblogs.com/plf-Jack/p/10951730.html
總結
以上是生活随笔為你收集整理的python之函数名称空间,作用域,嵌套函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浓缩版java8新特性
- 下一篇: 学习伟大的Python的第七天