最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于Python函數(shù)對象的名稱空間和作用域

 更新時間:2023年04月23日 09:22:32   作者:灰勒塔德  
這篇文章主要介紹了關(guān)于Python函數(shù)對象的名稱空間和作用域,數(shù)據(jù)的名稱是儲存到棧區(qū),而數(shù)據(jù)的內(nèi)容是儲存到堆區(qū),當我們要去使用數(shù)據(jù)的內(nèi)容時,我們可以通過數(shù)據(jù)的名稱來直接去表示數(shù)據(jù)的內(nèi)容,需要的朋友可以參考下

1.函數(shù)對象

前面我們學(xué)習(xí)了關(guān)于Python中的變量類型,例如int、str、bool、list等等……,其實函數(shù)我們可以去理解為一種更加高級的變量類型,也就是函數(shù)對象,其實是一個更加高級的變量容器,我們可以去把函數(shù)對象當做一個變量去使用。

(1)函數(shù)對象的引用

一個函數(shù)對象的形成是先定義一個函數(shù),然后寫入函數(shù)體,最后把這個函數(shù)賦值給一個變量,也就是函數(shù)的對象,然后我們可以去通過這個函數(shù)變量來實現(xiàn)函數(shù)相應(yīng)的功能。(先賦值,再調(diào)用)

示例1:

#定義一個函數(shù)對象fun
def fun():
    print('hello word',end=' ')
    print('wwww')
fun()  #直接調(diào)用這個函數(shù)對象

這種寫法是最直接的,沒有返回值。

示例2:

def fun():
    print('ww')
    return 123
kun = fun()
print(kun,type(kun))
#輸出結(jié)果:ww
#         123 <class 'int'>

這個寫法是定義了一個kun在變量,作為fun函數(shù)的對象,我們可以去通過這個對象去處理這個函數(shù)的返回值。

示例3:

def fun():
    return 123
kun = fun
print(kun,type(kun))
#輸出結(jié)果:<function fun at 0x00000154828AD280> <class 'function'>

這里我沒有加上()所以輸出結(jié)果是fun這個變量的地址,

示例4:

def fun():
    return 123
kun = fun
print(kun(),type(kun))
#輸出結(jié)果:123 <class 'function'>

這里先定義一個kun變量為fun的函數(shù)對象,下面如果要去調(diào)用這個函數(shù)的話就必須加上括號,如果沒有括號那這個對象只是函數(shù)的地址。

(2)函數(shù)可以放到序列里面

函數(shù)的返回值是一種變量類型,同時序列可以儲存變量,所以函數(shù)是可以放到序列里面去

這里就以列表為例子:

def fun():
    return '牛馬'
kun = fun
li=[1,5,kun]
print(li)
print(li[2]())
#輸出結(jié)果:[1, 5, <function fun at 0x000001BFB1ABD280>]
#         牛馬

(3)函數(shù)可以作為參數(shù) , 傳遞給另一個函數(shù)

示例:

def fun():
    return '牛馬'
def ff(st):
    print(f'我是{st}')
ff(fun())
#輸出結(jié)果:我是牛馬

(4)函數(shù)可以作為另一個函數(shù)的返回值

def ff():
    print('我愛你')
    return 520
def fun():
        return ff()
a=fun()
print(a,type(a))
#輸出結(jié)果:我愛你
#          520 <class 'int'>

這里是fun函數(shù)返回值為ff函數(shù),實際上是經(jīng)歷過了fun函數(shù)的功能,然后再次經(jīng)歷ff函數(shù)的功能,最后返回的是ff函數(shù)的520,故a的結(jié)果是520

2.名稱空間

數(shù)據(jù)的名稱是儲存到棧區(qū),而數(shù)據(jù)的內(nèi)容是儲存到堆區(qū),當我們要去使用數(shù)據(jù)的內(nèi)容時,我們可以通過數(shù)據(jù)的名稱來直接去表示數(shù)據(jù)的內(nèi)容,也就是通過棧區(qū)去找到堆區(qū)的東西,然后在堆區(qū)拿出來去使用。棧區(qū)和堆區(qū)是有對應(yīng)關(guān)系的。

1.內(nèi)建名稱空間
    生命周期:會隨著Python啟動而生成,程序關(guān)閉會摧毀
    保存的數(shù)據(jù):內(nèi)置函數(shù)(input,print....)
    生成順序:程序里最先生成的
2.全局名稱空間
    生命周期:會隨著Python啟動而生成,程序關(guān)閉會摧毀
    保存的數(shù)據(jù):函數(shù)名,變量名
    生成順序:在內(nèi)建名稱空間的后面
3.局部名稱空間
    生命周期:隨著函數(shù)的調(diào)用而生成,函數(shù)調(diào)用接受后就關(guān)閉
    保存的數(shù)據(jù):函數(shù)內(nèi)定義的名字
    生成順序:隨著函數(shù)的調(diào)用而生成

所以,我們定義的函數(shù)是屬于局部名稱空間,當函數(shù)被調(diào)用完成了之后就會被銷毀,里面變量儲存到的棧堆區(qū)都會被銷毀

3.作用域

(1)作用域的理解

作用域?qū)嶋H上就是變量的作用范圍,之前我們學(xué)了C語言都知道,有全局變量和局部變量,比如在for循環(huán)里面,里面的變量是一種局部變量,我們?nèi)绻谥骱瘮?shù)外面去定義一個變量,那就是全局變量。Python也是一樣的道理,變量也是有相應(yīng)的作用域。而變量的作用域是由定義的位置決定的

全局變量與局部變量的名字相同的時候,實質(zhì)上是兩個不同的變量, 其棧堆區(qū)是完全不一樣的!所以我們不可以通過局部來改變?nèi)肿兞?,否則就報錯

示例1:

#定義一個全局變量a
a=15
def fun():
    a=999
    print('hhh')
fun()
print(a)
#輸出結(jié)果:15

因為函數(shù)是放到棧堆區(qū),當函數(shù)調(diào)用完成了之后返回一個值,這個函數(shù)已經(jīng)被銷毀了,那么里面的變量也會與之銷毀,所以不會影響到全局變量,故a的值還是15

示例2:

#定義一個全局變量a
a=15
def fun():
    a=999
    return a
 
print(fun())
print(a)
#輸出結(jié)果:999
#         15

這個函數(shù)調(diào)用完成了之后就返回一個值,這個值函數(shù)內(nèi)部的功能的值,但是并沒有對這個函數(shù)以外的值進行修改,所以a的結(jié)果還是15,而函數(shù)的返回值是999

示例3:

b=15
def fun():
    b=b+99
fun()
print(b)
#輸出結(jié)果:系統(tǒng)報錯

因為b是一個全局變量,而函數(shù)里面的b是一個重新定義的局部變量,所以我們不可以去直接修改這個局部變量b,因為這個b是沒有初始數(shù)值的,而且類型也未定,所以無法進行運算處理

對比

b=15
def fun():
    b=0
    b+=99
    print(b)
fun()
print(b)
#輸出結(jié)果:99 15

對于這個而言,我給了函數(shù)里面b一個初始化值,所以可以進行運算處理,但這個b與外部全局變量的b是完全不相同,是兩個不同的變量

(2)作用域的轉(zhuǎn)換

在C語言中我們可以去設(shè)置靜態(tài)變量(static),從而使得這個變量可以在函數(shù)進行修改,同樣Python中可以利用關(guān)鍵字去修改變量的作用域,把局部變量作用到全局變量,或者把全局變量作用降級為局部

1.global 關(guān)鍵字 (局部變?nèi)?

在函數(shù)中,變量是這個函數(shù)的局部變量,只僅僅作用到函數(shù)內(nèi)部,我們對這個變量進行修改是不會影響外面的變量的,如果把這個局部變量轉(zhuǎn)換為全局變量的話,那么這變量就可以在函數(shù)里面進行修改,而且還可以影響到外部,當新定義global的變量名字與之前已有的變量名字出現(xiàn)重復(fù)的話,新的變量內(nèi)容會把之前的給覆蓋掉,而且新的全局變量也可以在函數(shù)內(nèi)部進行修改,從而影響全局。

注意事項:這個關(guān)鍵字是作用到全局變量,這個全局變量的棧堆區(qū)不會被銷毀

b=15
def fun():
    b=123
fun()
print(b)
#函數(shù)里面的b與外面的b是不同性質(zhì)的?。。?
#輸出結(jié)果:15

對比

b=15
def fun():
    global b
    b=123
fun()
print(b)
#輸出結(jié)果:123

重新定義了一個global后,此時這個b已經(jīng)是一個新的全局變量因為前面已經(jīng)有了一個全局變量b,所以這個新的全局變量會因為名字相同會把之前的全局變量b給直接覆蓋掉(類似于類型相同且名字相同的文件會被新的給覆蓋),故輸出結(jié)果是新的全局變量b的結(jié)果:123

2.nonlocal 關(guān)鍵字 (全局變局部)

功能:降權(quán),全局變成局部

前面講到過,已知一個全局變量,但是我不可以在函數(shù)里面對這個全局變量進行修改,而且函數(shù)里面的變量都是新的變量,既是跟外面的全局變量名字一模一樣,但是其儲存的棧堆區(qū)是完全不同的,那么當我想去通過一個局部函數(shù)來修改這個全局變量的話,這時候我就可以通過nonlocal關(guān)鍵字來進行 降維處理 。

注意事項:這個關(guān)鍵字是作用于嵌套函數(shù)的外部變量(相較于內(nèi)部函數(shù),外部函數(shù)是“全局”),這個變量的棧堆區(qū)會被銷毀

def fun():
    w=99
    def fun1():
        w=100
    fun1()
    return w
print(fun())
#輸出結(jié)果:99

VS

def fun():
    w=99
    def fun1():
        nonlocal w
        w=100
    fun1()
    return w
print(fun())
#輸出結(jié)果:100

這里,可以看出,w=99相對應(yīng)fun1()是一個全局變量,而fun1()內(nèi)部的w相對應(yīng)fun()是一個局部變量,當我用nonlocal關(guān)鍵字去定義了fun()的變量w之后,這個w變量已經(jīng)是屬于fun1()函數(shù)內(nèi)部的變量,這時候我們可以去修改這個w的值,從而去影響外部函數(shù),最后w的返回值也就是被修改后的100

到此這篇關(guān)于關(guān)于Python函數(shù)對象的名稱空間和作用域的文章就介紹到這了,更多相關(guān)Python函數(shù)作用域和名稱空間內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 回調(diào)函數(shù)的意義以及python實現(xiàn)實例

    回調(diào)函數(shù)的意義以及python實現(xiàn)實例

    本篇文章主要介紹了回調(diào)函數(shù)的意義以及python實現(xiàn)實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • python 計算數(shù)組中每個數(shù)字出現(xiàn)多少次--“Bucket”桶的思想

    python 計算數(shù)組中每個數(shù)字出現(xiàn)多少次--“Bucket”桶的思想

    這篇文章主要介紹了python 計算數(shù)組中每個數(shù)字出現(xiàn)多少次--“Bucket”桶的思想,需要的朋友可以參考下
    2017-12-12
  • python裝飾器類方法classmethod的使用場景

    python裝飾器類方法classmethod的使用場景

    這篇文章主要為大家介紹了python裝飾器類方法classmethod的使用場景,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • python做反被爬保護的方法

    python做反被爬保護的方法

    在本文里小編給大家整理了一篇關(guān)于python做反被爬保護的方法的方法,由此需求的同學(xué)參考學(xué)習(xí)下。
    2019-07-07
  • python解析多層json操作示例

    python解析多層json操作示例

    這篇文章主要介紹了python解析多層json操作,結(jié)合實例形式分析了Python針對多層json文件的讀取、解析、修改、保存等相關(guān)操作技巧,需要的朋友可以參考下
    2019-12-12
  • Django框架中視圖的用法

    Django框架中視圖的用法

    這篇文章介紹了Django框架中視圖的用法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • Python Tkinter Menu控件使用詳解

    Python Tkinter Menu控件使用詳解

    Menu控件(菜單控件)可以說是 GUI 中“精髓所在”,它以可視化的方式將一系列的命令進行分組,在每一個分組下又可以“隱藏”許多的程序執(zhí)行命令(即功能)。本文將詳細介紹它的使用,需要的可以參考一下
    2022-01-01
  • ?Python錯誤與異常處理

    ?Python錯誤與異常處理

    這篇文章主要介紹了?Python錯誤與異常處理,錯誤與異常處理在Python中具有非常重要的地位,熟練的使用錯誤與異常處理能夠為我們的Python編程提供很多的便利之處,希望您閱讀完本文后能夠有所收獲
    2022-01-01
  • pytorch中nn.RNN()匯總

    pytorch中nn.RNN()匯總

    這篇文章主要介紹了pytorch中nn.RNN()知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • python tkinter 獲得按鈕的文本值

    python tkinter 獲得按鈕的文本值

    這篇文章主要介紹了python tkinter 獲得按鈕的文本值,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評論

岑巩县| 隆林| 龙江县| 广东省| 利津县| 舞阳县| 满洲里市| 卢湾区| 柞水县| 永善县| 衢州市| 两当县| 德惠市| 建阳市| 嘉峪关市| 象山县| 阿坝县| 时尚| 翁源县| 沅陵县| 天全县| 红安县| 茂名市| 铜山县| 浮梁县| 兴城市| 进贤县| 怀仁县| 同心县| 曲靖市| 昌乐县| 平顺县| 加查县| 邵阳市| 高淳县| 青海省| 五寨县| 工布江达县| 苗栗县| 卢氏县| 扶风县|