溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Python中作用域的原理是什么

發(fā)布時(shí)間:2021-04-30 15:52:00 來(lái)源:億速云 閱讀:148 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)Python中作用域的原理是什么,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

Python主要用來(lái)做什么

Python主要應(yīng)用于:1、Web開(kāi)發(fā);2、數(shù)據(jù)科學(xué)研究;3、網(wǎng)絡(luò)爬蟲(chóng);4、嵌入式應(yīng)用開(kāi)發(fā);5、游戲開(kāi)發(fā);6、桌面應(yīng)用開(kāi)發(fā)。

Python具有靜態(tài)作用域,變量的作用域由它定義的位置決定,而與調(diào)用的位置無(wú)關(guān)。

 a = 2 
def f():
 a = 2

第一行的a的作用域是全局作用域,作用于定義位置后面的所有位置。

第四行的a的作用域是局部作用域,作用于f函數(shù)里。

Python能夠形成局部作用域的只有函數(shù)與類(lèi),其他語(yǔ)句不形成局部作用域。

函數(shù)與類(lèi)的局部作用域

def f():
  a = 1
class A:
  b = 2
if 1 == 1:
  c = 3
for _ in range(1):
  d = 4
while True:
  e = 5
  break
print(c, d, e)
try:
  print(a)
except Exception as e:
  print(e)
try:
  print(b)
except Exception as e:
  print(e)

輸出結(jié)果

 3 4 5
 name 'a' is not defined
 name 'b' is not defined

python動(dòng)態(tài)運(yùn)行時(shí),每個(gè)作用域都有三個(gè)名字空間:由局部變量組成的local名字空間,由全局變量組成的global名字空間,以及python內(nèi)建模塊的builtins名字空間,在查詢(xún)一個(gè)變量時(shí),搜索順序?yàn)閘ocal->global->builtins,即局部變量屏蔽全局變量,全局變量屏蔽內(nèi)建變量。

python的global名字空間是動(dòng)態(tài)的,即每遇到一個(gè)賦值語(yǔ)句(def與class也屬于賦值語(yǔ)句),global名字空間都可能發(fā)生變化。

global名字空間的動(dòng)態(tài)變化

 print(dir())
 a = 1
 print(dir())
 b = 2
 print(dir())

輸出結(jié)果

1 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__']
2 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a']
3 ['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'a', 'b']

從輸出結(jié)果可以看出,global名字空間是動(dòng)態(tài)增加的。

這意味著,雖然位于global名字空間的變量叫做全局變量,它的作用范圍也不是全局位置,它只作用于第一次賦值之后的位置。因?yàn)橹挥性谧兞抠x值初始化的時(shí)候,它才會(huì)被加入到global名字空間中。

函數(shù)和類(lèi)搜索的global名字空間是調(diào)用位置的global名字空間,與定義位置無(wú)關(guān)

def f():
  print(a)

try:
  f()
except Exception as e:
  print(e)

a = 2
f()

輸出結(jié)果

name 'a' is not defined
2

函數(shù)f打印全局變量a,a在第9行定義。在第五行調(diào)用f的時(shí)候,a不在global名字空間中,所以會(huì)輸出錯(cuò)誤信息,在第十行再次調(diào)用函數(shù)f時(shí),a已經(jīng)加入了global名字空間,所以能夠打印出a。

python為了提高效率,local名字空間是靜態(tài)實(shí)現(xiàn)的,因?yàn)閷?duì)于一個(gè)函數(shù)來(lái)說(shuō),它所包含的局部變量是明確已知的。

函數(shù)的local名字空間是靜態(tài)的

a = 4
def f():
  try:
    print(a)
  except Exception as e:
    print(e)
  a = 1
f()

輸出結(jié)果

 local variable 'a' referenced before assignment

在打印a的時(shí)候,在local名字空間中找到了a,但是這時(shí)候a并沒(méi)有賦值初始化,所以拋出異常。這也說(shuō)明了local名字空間與global名字空間不同,它會(huì)在一開(kāi)始就把所有的局部變量加入到名字空間中。

上述就是小編為大家分享的Python中作用域的原理是什么了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI