首頁  >  文章  >  後端開發  >  Python中的函數作用域

Python中的函數作用域

不言
不言原創
2018-05-07 13:56:361179瀏覽

這篇文章主要介紹了關於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 = 15
def 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 = 15
def 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 = 22
def 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 的規則查找,即:在局部找不到,便會去局部外的局部找(例如閉包),再找不到就會去全局找,再者去內置函數中找。

相關推薦:

python中的函數介紹

以上是Python中的函數作用域的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn