真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python變量作用域有哪些

Python變量作用域有哪些?很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供豐滿網(wǎng)站建設(shè)、豐滿做網(wǎng)站、豐滿網(wǎng)站設(shè)計(jì)、豐滿網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、豐滿企業(yè)網(wǎng)站模板建站服務(wù),十余年豐滿做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

在程序中定義一個(gè)變量時(shí),這個(gè)變量是有作用范圍的,變量的作用范圍被稱為它的作用域。

根據(jù)定義變量的位置,變量分為兩種:

局部變量:在函數(shù)中定義的變量,包括參數(shù),都被稱為局部變量。

全局變量:在函數(shù)外面、全局范圍內(nèi)定義的變量,被稱為全局變量。

每個(gè)函數(shù)在執(zhí)行時(shí),系統(tǒng)都會(huì)為該函數(shù)分配一塊“臨時(shí)內(nèi)存空間”,所有的局部變量都被保存在這塊臨時(shí)內(nèi)存空間內(nèi)。當(dāng)函數(shù)執(zhí)行完成后,這塊內(nèi)存空間就被釋放了,這些局部變量也就失效了,因此離開(kāi)函數(shù)之后就不能再訪問(wèn)局部變量了。

全局變量意味著它們可以在所有函數(shù)內(nèi)被訪問(wèn)。

不管是在函數(shù)的局部范圍內(nèi)還是在全局范圍內(nèi),都可能存在多個(gè)變量,每個(gè)變量“持有”該變量的值。從這個(gè)角度來(lái)看,不管是局部范圍還是全局范圍,這些變量和它們的值就像一個(gè)“看不見(jiàn)”的字典,其中變量名就是字典的 key,變量值就是字典的 value。

實(shí)際上,Python 提供了如下三個(gè)工具函數(shù)來(lái)獲取指定范圍內(nèi)的“變量字典”:

globals():該函數(shù)返回全局范圍內(nèi)所有變量組成的“變量字典”。

locals():該函數(shù)返回當(dāng)前局部范圍內(nèi)所有變量組成的“變量字典”。

vars(object):獲取在指定對(duì)象范圍內(nèi)所有變量組成的“變量字典”。如果不傳入object 參數(shù),vars() 和 locals() 的作用完全相同。

globals() 和 locals() 看似完全不同,但它們實(shí)際上也是有聯(lián)系的,關(guān)于這兩個(gè)函數(shù)的區(qū)別和聯(lián)系大致有以下兩點(diǎn):

locals() 總是獲取當(dāng)前局部范圍內(nèi)所有變量組成的“變量字典”,因此,如果在全局范圍內(nèi)(在函數(shù)之外)調(diào)用 locals() 函數(shù),同樣會(huì)獲取全局范圍內(nèi)所有變量組成的“變量字典”;而 globals() 無(wú)論在哪里執(zhí)行,總是獲取全局范圍內(nèi)所有變量組成的“變量字典”。

一般來(lái)說(shuō),使用 locals() 和 globals() 獲取的“變量字典”只應(yīng)該被訪問(wèn),不應(yīng)該被修改。但實(shí)際上,不管是使用 globals() 還是使用 locals() 獲取的全局范圍內(nèi)的“變量字典”,都可以被修改,而這種修改會(huì)真正改變?nèi)肿兞勘旧恚旱ㄟ^(guò) locals() 獲取的局部范圍內(nèi)的“變量字典”,即使對(duì)它修改也不會(huì)影響局部變量。

下面程序示范了如何使用 locals()、globals() 函數(shù)訪問(wèn)局部范圍和全局范圍內(nèi)的“變量字典”:

def test ():
    age = 20
    # 直接訪問(wèn)age局部變量
    print(age) # 輸出20
    # 訪問(wèn)函數(shù)局部范圍的“變量數(shù)組”
    print(locals()) # {'age': 20}
    # 通過(guò)函數(shù)局部范圍的“變量數(shù)組”訪問(wèn)age變量
    print(locals()['age']) # 20
    # 通過(guò)locals函數(shù)局部范圍的“變量數(shù)組”改變age變量的值
    locals()['age'] = 12
    # 再次訪問(wèn)age變量的值
    print('xxx', age) # 依然輸出20
    # 通過(guò)globals函數(shù)修改x全局變量
    globals()['x'] = 19
x = 5
y = 20
print(globals()) # {..., 'x': 5, 'y': 20}
# 在全局訪問(wèn)內(nèi)使用locals函數(shù),訪問(wèn)的是全局變量的“變量數(shù)組”
print(locals()) # {..., 'x': 5, 'y': 20}
# 直接訪問(wèn)x全局變量
print(x) # 5
# 通過(guò)全局變量的“變量數(shù)組”訪問(wèn)x全局變量
print(globals()['x']) # 5
# 通過(guò)全局變量的“變量數(shù)組”對(duì)x全局變量賦值
globals()['x'] = 39
print(x) # 輸出39
# 在全局范圍內(nèi)使用locals函數(shù)對(duì)x全局變量賦值
locals()['x'] = 99
print(x) # 輸出99

從上面程序可以清楚地看出,locals() 函數(shù)用于訪問(wèn)特定范圍內(nèi)的所有變量組成的“變量字典”,而 globals() 函數(shù)則用于訪問(wèn)全局范圍內(nèi)的全局變量組成的“變量字典”。

全局變量默認(rèn)可以在所有函數(shù)內(nèi)被訪問(wèn),但如果在函數(shù)中定義了與全局變量同名的變量,此時(shí)就會(huì)發(fā)生局部變量遮蔽(hide)全局變量的情形。例如如下程序:

name = 'Charlie'
def test ():
    # 直接訪問(wèn)name全局變量
    print(name) # Charlie
test()
print(name)

上面程序中,第 4 行直接訪問(wèn) name 變量,這是允許的,此時(shí)程序?qū)?huì)輸出 Charlie。如果在此之后增加如下一行代碼:

name = '孫悟空'

再次運(yùn)行該程序,將會(huì)看到如下錯(cuò)誤:

UnboundLocalError : local variable ‘name’ referenced before assignment

該錯(cuò)誤提示粗體字代碼所訪問(wèn)的 name 變量還未定義。這是什么原因呢?這正是由于程序在 test() 函數(shù)中增加了“name='孫悟空'”一行代碼造成的。

Python 語(yǔ)法規(guī)定,在函數(shù)內(nèi)部對(duì)不存在的變量賦值時(shí),默認(rèn)就是重新定義新的局部變量。因此這行代碼相當(dāng)于重新定義了 name 局部變量,這樣 name 全局變量就被遮蔽了,所以程序會(huì)報(bào)錯(cuò)。

為了避免這個(gè)問(wèn)題,可以通過(guò)以下兩種方式來(lái)修改上面程序:

訪問(wèn)被遮蔽的全局變量。如果希望程序依然能訪問(wèn) name 全局變量,且在函數(shù)中可重新定義 name 局部變量,也就是在函數(shù)中可以訪問(wèn)被遮蔽的全局變量,此時(shí)可通過(guò) globals() 函數(shù)來(lái)實(shí)現(xiàn),將上面程序改為如下形式即可:

name = 'Charlie'
def test ():
    # 直接訪問(wèn)name全局變量
    print(globals()['name'])  # Charlie
    name = '孫悟空'
test()
print(name)  # Charlie

在函數(shù)中聲明全局變量。為了避免在函數(shù)中對(duì)全局變量賦值(不是重新定義局部變量),可使用 global 語(yǔ)句來(lái)聲明全局變量。因此,可將程序改為如下形式:

name = 'Charlie'
def test ():
    # 聲明name是全局變量,后面的賦值語(yǔ)句不會(huì)重新定義局部變量
    global name
    # 直接訪問(wèn)name全局變量
    print(name)  # Charlie
    name = '孫悟空'
test()
print(name)  # 孫悟空

增加了“global name”聲明之后,程序會(huì)把 name 變量當(dāng)成全局變量,這意味著 test() 函數(shù)后面對(duì) name 賦值的語(yǔ)句只是對(duì)全局變量賦值,而不是重新定義局部變量。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


網(wǎng)站欄目:Python變量作用域有哪些
分享地址:http://weahome.cn/article/jsssig.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部