作用域(全局作用域和局部作用域)


作用域---->作用范圍(作用域又叫作用范圍,在什么范圍內有效)

一、全局作用域:包含內置名稱空間、全局名稱空間

  1.存活周期:該范圍內的名字全局存活(除非被刪除,否則在整個文件執行過程中存活)

  2.全局有效,在任意位置都可以使用,被所有函數共享

二、局部作用域:包含局部名稱空間

  1.存活周期:該范圍內的名字臨時存活(在函數調用時臨時生成,調用結束后就釋放)

  2.局部有效,只能在函數內使用

三、global與nonlocal

  1.如果在局部中想要修改全局的名字所對應的值,那么就需要global,主要針對不可變類型

    示例1:global主要是針對不可變類型

       x = 100  # 全局名稱空間(也是全局作用域)

       def func():

        global x  # 使用global,表示修改全局作用域中的x

        x = 200  # 在函數內,表示為局部名稱空間(也是局部作用域)

       func()

       print(x)  # 輸出結果為:200,x=200為局部作用域,也是局部名稱空間,這里使用了global(表示修改全局中的),所以修改了全局中的x = 100

    示例2:示例1中主要是針對不可變類型的,示例2針對可變類型

      x = []  # 全局名稱空間,聲明的是一個數組

      def func():

        a.append(111)  # 直接對數組進行添加操作,對於可變類型的就不用使用global了,因為在函數中可以直接對可變類型進行操作

      func()

      print(x)  # 輸出結果為:[111]

  2.修改函數外層函數包含的名字對於的值(與global一樣針對不可變類型),這是需要使用nonlocal

   示例1:針對不可變類型

      x = 100  # 全局名稱空間

      def func():

        x = 200  # 局部名稱空間

        def func1():

          nonlocal x  # 表示修改該層函數上層函數的x,如果有三層函數,找上層表示先找第二層,如果沒有找到則會找第一層,如果還沒有就會報錯,不會找全局

          x = 300

        func1()

        print(x)  # 輸出結果為:300,x =300為局部作用域,這里使用了nonlocal(表示修改func1上一層中的名稱對應的值),所以修改了x=200的值

      func()

    示例2:針對可變類型時,與global一樣的,直接進行修改即可,不適用nonlocal

      

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM