开心六月综合激情婷婷|欧美精品成人动漫二区|国产中文字幕综合色|亚洲人在线成视频

    1. 
      
        <b id="zqfy3"><legend id="zqfy3"><fieldset id="zqfy3"></fieldset></legend></b>
          <ul id="zqfy3"></ul>
          <blockquote id="zqfy3"><strong id="zqfy3"><dfn id="zqfy3"></dfn></strong></blockquote>
          <blockquote id="zqfy3"><legend id="zqfy3"></legend></blockquote>
          打開APP
          userphoto
          未登錄

          開通VIP,暢享免費電子書等14項超值服

          開通VIP
          Python中的變量作用域總結(jié)

          大家好,我是老馬的程序人生~

          變量作用域是Python定義函數(shù)時需要考慮的重要問題,在此為大家總結(jié)一下。

          「1. 內(nèi)嵌函數(shù)」

          Python支持內(nèi)嵌函數(shù)(內(nèi)嵌函數(shù):函數(shù)內(nèi)部又定義一個完整的函數(shù))。

          【例子】

          def outer():
              print('outer函數(shù)在這被調(diào)用')

              def inner():
                  print('inner函數(shù)在這被調(diào)用')

              inner()  # 該函數(shù)只能在outer函數(shù)內(nèi)部被調(diào)用


          outer()
          # outer函數(shù)在這被調(diào)用
          # inner函數(shù)在這被調(diào)用

          「2. 局部作用域、閉包作用域、全局作用域、內(nèi)置作用域」

          【例子】

          def foo():
              b = 'hello'

              # Python中可以在函數(shù)內(nèi)部再定義函數(shù)
              def bar():
                  c = True
                  print(a)
                  print(b)
                  print(c)

              bar()
              # print(c)  # NameError: name 'c' is not defined



          a = 100
          # print(b)  # NameError: name 'b' is not defined
          foo()

          # 100
          # hello
          # True

          上面的代碼能夠順利的執(zhí)行并且打印出100、hello和True,但我們注意到了,在bar()函數(shù)的內(nèi)部并沒有定義ab兩個變量,那么ab是從哪里來的。

          我們在上面代碼中定義了一個變量a,這是一個全局變量(global variable),屬于全局作用域,因為它沒有定義在任何一個函數(shù)中。在上面的foo()函數(shù)中我們定義了變量b,這是一個定義在函數(shù)中的局部變量(local variable),屬于局部作用域,在foo()函數(shù)的外部并不能訪問到它;但對于foo()函數(shù)內(nèi)部的bar()函數(shù)來說,變量b屬于閉包作用域,在bar()函數(shù)中我們是可以訪問到它的。bar()函數(shù)中的變量c屬于局部作用域,在bar()函數(shù)之外是無法訪問的。

          事實上,Python查找一個變量時會按照“局部作用域”、“閉包作用域”、“全局作用域”和“內(nèi)置作用域”的順序進(jìn)行搜索,前三者我們在上面的代碼中已經(jīng)看到了,所謂的“內(nèi)置作用域”就是Python內(nèi)置的那些標(biāo)識符,我們之前用過的input、printint等都屬于內(nèi)置作用域。

          「3. 閉包」

          閉包是函數(shù)式編程的一個重要的語法結(jié)構(gòu),是一種特殊的內(nèi)嵌函數(shù)。

          如果在一個內(nèi)嵌函數(shù)里對外層非全局作用域的變量進(jìn)行引用,那么內(nèi)部函數(shù)就被認(rèn)為是閉包。

          def funX(x):
              def funY(y):
                  return x * y
                  
              return funY


          i = funX(8)
          print(type(i))  # <class 'function'>
          print(i(5))  # 40

          【例子】閉包的返回值通常是函數(shù)。

          def make_counter(init):
              counter = [init]

              def inc(): counter[0] += 1

              def dec(): counter[0] -= 1

              def get(): return counter[0]

              def reset(): counter[0] = init

              return inc, dec, get, reset


          inc, dec, get, reset = make_counter(0)
          inc()
          inc()
          inc()
          print(get())  # 3
          dec()
          print(get())  # 2
          reset()
          print(get())  # 0

          「4. global和nonlocal關(guān)鍵字」

          再看看下面這段代碼,我們希望通過函數(shù)調(diào)用修改全局變量a的值,但實際上下面的代碼是做不到的。

          def foo():
              a = 200
              print(a)


          a = 100
          foo()
          print(a)
          # 200
          # 100

          在調(diào)用foo()函數(shù)后,我們發(fā)現(xiàn)a的值仍然是100,這是因為當(dāng)我們在函數(shù)foo()中寫a = 200的時候,是重新定義了一個名字為a的局部變量,它跟全局作用域的a并不是同一個變量,因為局部作用域中有了自己的變量a,因此foo()函數(shù)不再搜索全局作用域中的a。

          如果我們希望在foo()函數(shù)中修改全局作用域中的a,代碼如下所示。

          def foo():
              global a
              print(a) 
              a = 200
              print(a) 


          a = 100
          foo()
          print(a) 

          # 100
          # 200
          # 200

          我們可以使用global關(guān)鍵字來指示foo()函數(shù)中的變量a來自于全局作用域,如果全局作用域中沒有a,那么下面一行的代碼就會定義變量a并將其置于全局作用域。

          同理,如果我們希望函數(shù)內(nèi)部的函數(shù)能夠修改閉包作用域中的變量,可以使用nonlocal關(guān)鍵字來指示變量來自于閉包作用域。

          def outer():
              num = 10

              def inner():
                  nonlocal num  # nonlocal關(guān)鍵字聲明
                  num = 100
                  print(num)

              inner()
              print(num)


          outer()

          # 100
          # 100

          小結(jié):

          Python 中,程序的變量并不是在哪個位置都可以訪問的,訪問權(quán)限決定于這個變量是在哪里賦值的。

          • 定義在函數(shù)內(nèi)部的變量擁有局部作用域(或閉包作用域),該變量稱為局部變量。
          • 定義在函數(shù)外部的變量擁有全局作用域,該變量稱為全局變量。
          • 局部變量能在其被聲明的函數(shù)內(nèi)部訪問或在其內(nèi)嵌函數(shù)中訪問,而全局變量可以在整個程序范圍內(nèi)訪問。
          • 如果要修改全局作用域中的變量則需要 global 關(guān)鍵字
          • 如果要修改閉包作用域中的變量則需要 nonlocal 關(guān)鍵字

          本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
          打開APP,閱讀全文并永久保存 查看更多類似文章
          猜你喜歡
          類似文章
          《源碼探秘 CPython》47. 名字、作用域、名字空間(上)
          初識 Python:全局、局部和非局部變量(帶示例) | Linux 中國
          【Python之路】特別篇
          一篇文章學(xué)會 Python 中閉包與變量作用域
          python global、locals()、nonlocal
          函數(shù)作用域--python
          更多類似文章 >>
          生活服務(wù)
          分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
          綁定賬號成功
          后續(xù)可登錄賬號暢享VIP特權(quán)!
          如果VIP功能使用有故障,
          可點擊這里聯(lián)系客服!

          聯(lián)系客服