Python中的函數範圍

來源:互聯網
上載者:User
這篇文章主要介紹了關於Python中的函數範圍,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

在python中,一個函數就是一個範圍。這篇文章重點給大家介紹python中的函數範圍,感興趣的朋友一起看看吧

在python中,一個函數就是一個範圍

name = 'xiaoyafei'def change_name():  name = '肖亞飛'  print('在change_name裡的name:',name)change_name() # 調用函數print("在外面的name:",name)

運行結果如下:

在change_name裡的name: 肖亞飛
在外面的name: xiaoyafei

我們再試一下在嵌套函數中是如何的尋找的?

age = 15def func():  print('第一層age:',age) # 第一層age: 15  def func2():    age = 73    print("func2中的age:",age) # func2中的age: 73    def func3():      age = 84      print("func3中的age:",age) # func3中的age: 84    func3() # 調用func3函數  func2() # 調用func2函數func()

在以上嵌套函數中,就能夠很好的說明一個函數就是一個範圍,那麼我們現在稍微改一下代碼看看情況?

age = 15def func():  print('第一層age:',age) # 第一層age: 15  def func2():    print("func2中的age:",age) # func2中的age: 15 # 看到沒有,如果當前範圍裡沒有age變數,那麼它就會往上找    def func3():      age = 84      print("func3中的age:",age) # func3中的age: 84    func3() # 調用func3函數  func2() # 調用func2函數func()

那麼,這時候有人就說了,屁話一大堆講的原來是局部變數和全域變數,那麼我想問:在上面這個嵌套函數中,func2中並沒有age變數,那麼它是如何找到全域變數age = 15的?

此時我們就需要來看一下範圍的尋找順序了:

變數範圍LEGB

  • L:locals 函數內的名稱空間,包括局部變數和實參

  • E:enclosing 外部嵌套函數的名稱空間,即相鄰的上一層,打個比方說:func2中沒有age變數則會去func裡找這個

  • G:globals 全域變數

  • B:builtins 內建模組的名稱空間

咳咳,還是先瞭解下什麼是名稱空間把?

名稱空間,又名 name space ,顧名思義就是存放名字的地方,存什麼名字呢?舉例說明,x = 1 ,1存放在記憶體當中,那麼變數名x存放在哪裡呢? 名稱空間就是存放名字x與1綁定關係的地方

>>> x = 1>>> id(1)1576430608

名稱空間分為以下3種:

  • locals: 是函數內的名稱空間,包括局部變數和形參

  • globals: 全域變數,函數定義所在模組的名字空間

  • builtins: 內建模組的名字空間

不同變數的範圍不同就是有這個變數所在的命名空間決定的.

範圍即範圍

  • 全域範圍:全域存活,全域有效

  • 局部範圍:臨時存貨,局部有效

讓我們來舉例看一下

level = 'L0'n = 22def func():  level = 'L1'  n = 33  print(locals()) # {'n': 33, 'level': 'L1'} 在之前說過在python中,一個函數就是一個範圍,這就很完美的體現了  def outer():    n = 44    level = 'L2'    print(locals(),n) # {'level': 'L2', 'n': 44} 44    def inner():      level = 'L3'      print(locals(),n) # {'level': 'L3', 'n': 44} 44    inner()  outer()func()

以 L --> E --> G -->B 的規則尋找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全域找,再者去內建函數中找。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.