python之函数名称空间,作用域,嵌套函数
目錄
- 嵌套函數(shù)
- 定義
- 名稱空間的三大類(只存變量名)
- 名稱空間加載順序
- 變量名的查找順序?yàn)?/li>
- 作用域
嵌套函數(shù)
定義
函數(shù)內(nèi)部定義的函數(shù),無(wú)法在函數(shù)外部使用內(nèi)部定義的函數(shù)。
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 '''名稱空間的三大類(只存變量名)
內(nèi)置名稱空間
- 定義:python解釋器自帶的方法,如:int,float,len等。==類似小整數(shù)池==
- 生命周期:在python解釋器啟動(dòng)時(shí),就開(kāi)始生效。直到python解釋器關(guān)閉
全局名稱空間
定義:除了內(nèi)置和局部的名字之外,其余都存在全局名稱空間。如下面的代碼x,func,z
x = 1def func():passif x > 11:z = 20000 else:z = 555 print(z)生命周期:在文件執(zhí)行時(shí)生效,文件執(zhí)行完后失效
局部名稱空間
定義:在函數(shù)內(nèi)部的都叫局部,也就是說(shuō)在函數(shù)內(nèi)部定義的變量 就是局部變量。如下圖的x ,f2等等
def test_one():x = 1def max_num():print("from max_num")max_num()test_one()生命周期:在調(diào)用函數(shù)時(shí)生效,當(dāng)函數(shù)執(zhí)行結(jié)束后失效
名稱空間加載順序
內(nèi)置名稱空間 --> 全局名稱空間 --> 局部名稱空間
作用域
全局作用域
定義:全局有效,全局存活,包含內(nèi)置名稱空間和全局名稱空間.如x,test_one
x = 1def test_one():print(x)test_one()
局部作用域
定義:局部有效,臨時(shí)存儲(chǔ),只包含局部名稱空間。如x
def test_one()x = 1print(x)test_one()
PS:當(dāng)局部名稱空間沒(méi)有對(duì)應(yīng)的變量時(shí),系統(tǒng)會(huì)自動(dòng)去全局名稱空間查找。沒(méi)有找到就會(huì)報(bào)錯(cuò)。
# 第一種情況 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 ''''''總結(jié):對(duì)于第一種情況,程序調(diào)用了two函數(shù),在two函數(shù)中調(diào)用了one函數(shù),而one函數(shù)中沒(méi)有定義x變量,對(duì)于one函數(shù)而言,它屬于局部名稱空間,變量x既然沒(méi)有定義,那么就直接去上一級(jí)找,因此x=1對(duì)于第二種情況,one函數(shù)中定義了x變量,因此直接使用即可,所以x=10'''函數(shù)對(duì)象+作用域應(yīng)用
補(bǔ)充知識(shí)點(diǎn)
global關(guān)鍵字:修改全局作用域中的變量
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關(guān)鍵字
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"調(diào)用函數(shù)前: {lis}") f1() print(f"調(diào)用函數(shù)后: {lis}")在局部如果想要修改全局的不可變類型,需要借助global聲明,聲明為全局的變量,即可直接修改
轉(zhuǎn)載于:https://www.cnblogs.com/plf-Jack/p/10951730.html
總結(jié)
以上是生活随笔為你收集整理的python之函数名称空间,作用域,嵌套函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浓缩版java8新特性
- 下一篇: 学习伟大的Python的第七天