亚洲免费在线视频-亚洲啊v-久久免费精品视频-国产精品va-看片地址-成人在线视频网

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

Python作用域與名字空間原理詳解

瀏覽:59日期:2022-08-01 16:26:17

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

a = 2 def f(): a = 2

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

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

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

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

def f(): a = 1class A: b = 2if 1 == 1: c = 3for _ in range(1): d = 4while True: e = 5 breakprint(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名字空間,在查詢一個(gè)變量時(shí),搜索順序?yàn)閘ocal->global->builtins,即局部變量屏蔽全局變量,全局變量屏蔽內(nèi)建變量。

python的global名字空間是動(dòng)態(tài)的,即每遇到一個(gè)賦值語句(def與class也屬于賦值語句),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ù)和類搜索的global名字空間是調(diào)用位置的global名字空間,與定義位置無關(guān)

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

輸出結(jié)果

name ’a’ is not defined2

函數(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ù)來說,它所包含的局部變量是明確已知的。

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

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

輸出結(jié)果

local variable ’a’ referenced before assignment

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

總結(jié):

1. python是靜態(tài)作用域,變量初始化的位置決定了它的作用域,而與變量調(diào)用的位置無關(guān)

2. global名字空間是動(dòng)態(tài)的,不同位置的global名字空間不同,local名字空間是靜態(tài)的,局部變量在整個(gè)局部作用域內(nèi)可見。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 老色歌uuu26 老师张开腿让我爽了一夜视频 | 国产精品日韩欧美在线 | 男女午夜视频 | 特级毛片全部免费播放器 | 夜夜春夜夜夜夜猛噜噜噜噜噜 | 在线视频 中文字幕 | 欧美精品综合一区二区三区 | 中文字幕日韩精品在线 | 国产成人麻豆tv在线观看 | 97免费视频免费视频 | 在线看a级片 | 午夜男人女人爽爽爽视频 | 成人免费视频网址 | 亚洲精品久久一区影院 | 一级片视频在线 | www.91香蕉视频 | 日本免费人做人一区在线观看 | 视频二区好吊色永久视频 | 亚洲精品一区二区三区福利 | 亚洲人成在线免费观看 | 国产国语一级毛片全部 | 99精品免费 | 玖玖玖精品视频免费播放 | 手机在线观看亚洲国产精品 | 六月丁香婷婷色狠狠久久 | 久久精品一区二区免费看 | 国产在线观看xxxx免费 | 久久婷婷影院 | 久久精品免费一区二区视 | 亚洲99久久久久综合 | 91精品免费高清在线 | 一区二区三区中文字幕 | 三级理论手机在线观看视频 | 成年人午夜免费视频 | 久草免费在线观看 | 日韩欧美视频一区二区在线观看 | 国产精品免费综合一区视频 | 偷拍视频一区在线观看 | 牛人盗摄一区二区三区视频 | 亚洲精品98久久久久久中文字幕 | 日韩国产精品99久久久久久 |