国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

深入了解Python 變量作用域

瀏覽:2日期:2022-07-16 13:34:17

特點

python的作用域是靜態(tài)的,在源代碼中變量名被賦值的位置決定了該變量能被訪問的范圍。即Python變量的作用域由變量所在源代碼中的位置決定。Python中并不是所有的語句塊中都會產(chǎn)生作用域。只有當(dāng)變量在Module(模塊)、Class(類)、def(函數(shù))中定義的時候,才會有作用域的概念。

1. 函數(shù)內(nèi)部的變量,函數(shù)外部不能訪問

def func(): variable = 100 print(variable) print(variable) # name ’variable’ is not defined

2. 函數(shù)上層的變量(標(biāo)量)只能讀取,不能再次定義,初始化

def counter1(): n = 0 def compute(): n = n + 1 # n為標(biāo)量(數(shù)值,字符串,浮點數(shù)),Python程序會因為“如果內(nèi)部函數(shù)有引用外部函數(shù)的同名變量或者全局變量,并且對這個變量有修改.那么python會認(rèn)為它是一個局部變量,又因為函數(shù)中沒有n的定義和賦值,所以報錯 # y = n + 1 # 更改為y就沒事 # return y return n return compute

variable = 300def test_scopt(): print(variable) # 此時調(diào)用局部變量variable并有沒綁定到一個內(nèi)存對象(沒有定義和初始化,即沒有賦值)。本質(zhì)上還是遵循的LEGB法則 variable = 200 #因為這里,前面調(diào)用過一次,所以variable就變?yōu)榱司植孔兞? # print(variable) # 寫在下面就沒問題,因為variable是新的局部變量,而不是重新被定義,卻沒有綁定test_scopt()

Python中的模塊代碼在執(zhí)行之前,并不會經(jīng)過預(yù)編譯,但是模塊內(nèi)的函數(shù)體代碼在運行前會經(jīng)過預(yù)編譯,因此不管變量名的綁定發(fā)生在作用域的那個位置,都能被編譯器知道。Python雖然是一個靜態(tài)作用域語言,但變量名查找是動態(tài)發(fā)生的,直到在程序運行時,才會發(fā)現(xiàn)作用域方面的問題,

3. list,dict等復(fù)合變量里面的值都可以引用更改

def counter(): n = [0] def compute(): n[0] += 1 # 更改的是n里面的第一個值,不是更改n return n[0] return computefunc = counter()func() # 1func() # 2func() # 3

4. global 聲明全局變量,如果在局部要對全局變量修改,需要在局部也要先聲明該全局變量

def counter1(): n = 0 def compute(): global n # 如果在局部要對全局變量修改,需要在局部也要先聲明該全局變量,但此處也會報錯,因為沒有全局變量n n += 1 return n return compute# rightdef counter1(): global n n = 0 def compute(): global n n += 1 return n return compute

5. nonlocal關(guān)鍵字用來在函數(shù)或其他作用域中使用外層(非全局)變量

def make_counter(): count = 0 def counter(): nonlocal count # 使用外層非全局變量 count += 1 return count return counter

作用域的類型

在Python中,使用一個變量時并不嚴(yán)格要求需要預(yù)先聲明它,但是在真正使用它之前,它必須被綁定到某個內(nèi)存對象(被定義、賦值);這種變量名的綁定將在當(dāng)前作用域中引入新的變量,同時屏蔽外層作用域中的同名變量。

L(local)局部作用域

局部變量:包含在def關(guān)鍵字定義的語句塊中,即在函數(shù)中定義的變量。每當(dāng)函數(shù)被調(diào)用時都會創(chuàng)建一個新的局部作用域。Python中也有遞歸,即自己調(diào)用自己,每次調(diào)用都會創(chuàng)建一個新的局部命名空間。在函數(shù)內(nèi)部的變量聲明,除非特別的聲明為全局變量,否則均默認(rèn)為局部變量。有些情況需要在函數(shù)內(nèi)部定義全局變量,這時可以使用global關(guān)鍵字來聲明變量的作用域為全局。局部變量域就像一個 棧,僅僅是暫時的存在,依賴創(chuàng)建該局部作用域的函數(shù)是否處于活動的狀態(tài)。所以,一般建議盡量少定義全局變量,因為全局變量在模塊文件運行的過程中會一直存在,占用內(nèi)存空間。注意:如果需要在函數(shù)內(nèi)部對全局變量賦值,需要在函數(shù)內(nèi)部通過global語句聲明該變量為全局變量。

E(enclosing)嵌套作用域

E也包含在def關(guān)鍵字中,E和L是相對的,E相對于更上層的函數(shù)而言也是L。與L的區(qū)別在于,對一個函數(shù)而言,L是定義在此函數(shù)內(nèi)部的局部作用域,而E是定義在此函數(shù)的上一層父級函數(shù)的局部作用域。主要是為了實現(xiàn)Python的閉包,而增加的實現(xiàn)。

G(global)全局作用域

即在模塊層次中定義的變量,每一個模塊都是一個全局作用域。也就是說,在模塊文件頂層聲明的變量具有全局作用域,從外部開來,模塊的全局變量就是一個模塊對象的屬性。注意:全局作用域的作用范圍僅限于單個模塊文件內(nèi)

B(built-in)內(nèi)置作用域

系統(tǒng)內(nèi)固定模塊里定義的變量,如預(yù)定義在builtin 模塊內(nèi)的變量。

作用域鏈:變量名解析LEGB法則

搜索變量名的優(yōu)先級:局部作用域 > 嵌套作用域 > 全局作用域 > 內(nèi)置作用域LEGB法則: 當(dāng)在函數(shù)中使用未確定的變量名時,Python會按照優(yōu)先級依次搜索4個作用域,以此來確定該變量名的意義。首先搜索局部作用域(L),之后是上一層嵌套結(jié)構(gòu)中def或lambda函數(shù)的嵌套作用域(E),之后是全局作用域(G),最后是內(nèi)置作用域(B)。按這個查找原則,在第一處找到的地方停止。如果沒有找到,則會出發(fā)NameError錯誤。

example 1

name = 'lzl'def f1(): print(name)def f2(): name = 'eric' f1() f2() # 在函數(shù)未執(zhí)行之前,作用域鏈就已經(jīng)形成了,此時f1()的上一級應(yīng)該name = ’lzl’

example 2

def scope_test(): def do_local(): spam = 'local spam' # 此函數(shù)定義了另外的一個spam字符串變量,并且生命周期只在此函數(shù)內(nèi)。此處的spam和外層的spam是兩個變量,如果寫出spam = spam + “l(fā)ocal spam” 會報錯 def do_nonlocal(): nonlocal spam # 使用外層的spam變量 test spam spam = 'nonlocal spam' def do_global(): global spam spam = 'global spam' spam = 'test spam' do_local() print('After local assignmanent:', spam) # test spam do_nonlocal() print('After nonlocal assignment:',spam) # nonlocal spam do_global() print('After global assignment:',spam) # nonlocal spam ???? 先找是本地變量,找到的本地變量已經(jīng)在do_nonlocal()里面改變了所以輸出的是nonlocal spamscope_test()print('In global scope:',spam) # global spam

以上就是深入了解Python 變量作用域的詳細(xì)內(nèi)容,更多關(guān)于Python 變量作用域的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 99在线观看巨臀大臀视频 | 日本天堂网在线 | 国产精品一一在线观看 | 亚洲国产精品综合久久一线 | 久久精品国产只有精品6 | 亚洲欧美久久一区二区 | 免费区一级欧美毛片 | 亚洲国产成人久久三区 | 成人综合在线视频免费观看 | 性刺激免费视频观看在线观看 | 日本手机看片 | 久久国产一级毛片一区二区 | 欧美啪啪一级毛片 | 九色91 | 欧美成人免费观看bbb | 国产天堂| 亚洲精品一区二区三区四区 | 欧美一级毛片大片免费播放 | 91精品国产免费久久久久久 | 最新国产精品亚洲二区 | 最新三级网站 | 国产亚洲欧美日韩综合综合二区 | 深夜福利网站在线观看 | 欧美一区永久视频免费观看 | 日韩国产成人资源精品视频 | 波多野结衣免费免费视频一区 | 日韩三级观看 | 国产成人影院在线观看 | 欧美视频在线观看免费精品欧美视频 | 亚洲a级 | 国产一区二区福利久久 | 国产精品久久久久久一区二区三区 | 成人黄色在线观看 | 精品在线小视频 | 在线观看视频亚洲 | 欧美黄色一级视屏 | 国产一区二区三区免费播放 | 一区二区不卡视频在线观看 | 美女被躁爽死 | 国产精品二区三区 | 欧美成人免费tv在线播放 |