python函數作用域與閉包_理解 Python 中的作用域和閉包

未經作者允許,請勿轉載,違者必追究責任。

1. 作用域

Python的作用域可以分為四種:

L (Local) 局部作用域

E (Enclosing) 閉包函數外的函數中

G (Global) 全局作用域

B (Built-in) 內建作用域

變量/函數 的查找順序: L –> E –> G –>B

意思是,在局部找不到的,便去局部外的局部作用域找(例如 閉包),再找不到的就去全局作業域裏找,再找不到就去內建作業域中找。

會影響 變量/函數 作用範圍的有

函數:def 或 lambda

類:class

關鍵字:global noglobal

文件:*py

推導式:[],{},()等,僅限Py3.x中,Py2.x會出現變量泄露。

1、賦值在前,引用在後

# ------同作用域內------

name = "MING"

print(name)

# ------不同作用域內------

name = "MING"

def main():

print(name)

2、引用在前,賦值在後(同一作用域內)

print(name)

name = "MING"

# UnboundLocalError: local variable 'name' referenced before assignment

3、賦值在低層,引用在高層

# L -> E -> G -> B

# 從左到右,由低層到高層

def main():

name = "MING"

print(name)

# NameError: name 'name' is not defined

2. 閉包

閉包這個概念很重要噢。你一定要掌握。

在一個外函數中定義了一個內函數,內函數里運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。其實裝飾函數,很多都是閉包。

好像並不難理解,為什麼初學者會覺得閉包難以理解呢?

我解釋一下,你就明白了。

一般情況下,在我們認知當中,如果一個函數結束,函數的內部所有東西都會釋放掉,還給內存,局部變量都會消失。但是閉包是一種特殊情況,如果外函數在結束的時候發現有自己的臨時變量將來會在內部函數中用到,就把這個臨時變量綁定給了內部函數,然後自己再結束。

你可以看下面這段代碼,就構成了閉包。在內函數里可以引用外函數的變量。

def deco():

name = "MING"

def wrapper():

print(name)

return wrapper

deco()()

# 輸出:MING

3. 改變作用域

變量的作用域,與其定義(或賦值)的位置有關,但不是絕對相關。 因為我們可以在某種程度上去改變向上的作用範圍。

關鍵字:global 將 局部變量 變為全局變量

關鍵字:nonlocal 可以在閉包函數中,引用並使用閉包外部函數的變量(非全局的噢)

global好理解,這裏只講下nonlocal。

先來看個例子

def deco():

age = 10

def wrapper():

age += 1

return wrapper

deco()()

運行一下,會報錯。

# UnboundLocalError: local variable 'age' referenced before assignment

但是這樣就OK

def deco():

age = 10

def wrapper():

nonlocal age

age += 1

return wrapper

deco()()

# 輸出:11

其實,你如果不使用 +=、-=等一類的操作,不加nonlocal也沒有關係。這就展示了閉包的特性。

def deco():

age = 10

def wrapper():

print(age)

return wrapper

deco()()

# 輸出:10

1.5.4 變量集合

在Python中,有兩個內建函數,你可能用不到,但是需要掌握它們。

globals() :以dict的方式存儲所有全局變量

locals():以dict的方式存儲所有局部變量

globals()

def foo():

print("I am a func")

def bar():

foo="I am a string"

foo_dup = globals().get("foo")

foo_dup()

bar()

# 輸出

# I am a func

locals()

other = "test"

def foobar():

name = "MING"

gender = "male"

for key,value in locals().items():

print(key, "=", value)

foobar()

# 輸出

# name = MING

# gender = male

更多相關推薦

python閉包變量作用域_Python學...

一、全局變量與局部變量一個模塊中,最高級別的變量有全局作用域。全局變量一個特徵就是:除非...

繼續閲讀

python什麼是閉包的作用域_Pytho...

什麼是閉包在維基中,閉包的解釋是這樣的:在計算機科學中,閉包(Closure)是詞法閉包(LexicalC...

繼續閲讀

python 中函數對象、閉包、作用...

函數對象函數名是存放了函數的內存地址,存放了內存地址的變量都是對象,即函數名就是函數對象...

繼續閲讀

python函數作用域與閉包

L:local函數內部作用域E:enclosing函數內部與內嵌函數之間G:global全局作用域B:build_in內置作...

繼續閲讀

python 閉包函數的作用_理解Pyth...

1.定義閉包是函數式編程的一個重要的語法結構,函數式編程是一種編程範式(而面向過程編程和麪...

繼續閲讀

python函數作用域_Python函數的...

作用域規則命名空間是從名稱到對象的映射,Python中主要是通過字典實現的,主要有以下幾個命名...

繼續閲讀

python閉包變量作用域_Python閉...

Ihavethefollowingcodeinsideafunction:stored_blocks={}defreplace_blocks(m):block=m.group(...

繼續閲讀

python函數作用域_python函數作...

作用域變量到底是什麼呢?可將其視為指向值的名稱。因此,執行賦值語句x=1後,名稱x指向值1。...

繼續閲讀

python函數中變量的作用域_Pytho...

在上次的學習中,初步認識了Python的自定義函數方式及變量參數。那麼編程中的局部變量和全局變...

繼續閲讀