Python基礎 深入閉包與變數作用域

2021-10-24 19:40:16 字數 2923 閱讀 8831

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

變數/函式 的查詢順序:

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

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

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

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

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

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

你可以看下面這段**,就構成了閉包。在內函式裡可以引用外函式的變數。

def deco()

: name =

"ming"()

:print

(name)

deco()

()# 輸出:ming

變數的作用域,與其定義(或賦值)的位置有關,但不是絕對相關。

因為我們可以在某種程度上去改變向上的作用範圍。

關鍵字:global

將 區域性變數 變為全域性變數

關鍵字:nonlocal

可以在閉包函式中,引用並使用閉包外部函式的變數(非全域性的噢)

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

先來看個例子

def deco()

: age =10(

):age +=1

deco()

()

執行一下,會報錯。

# unboundlocalerror: local variable 'age' referenced before assignment
但是這樣就ok

def deco()

: age =10(

):nonlocal age

age +=1

deco()

()# 輸出:11

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

def deco()

: age =10(

):print

(age)

deco()

()# 輸出:10

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

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

如果你想學習自動化測試、效能測試、測試開發,但是自己又非常的迷茫,沒有思路又怕耽誤時間,那

閉包與變數

js高程中關於閉包與變數這一節,講到乙個案例,我當時看的一臉懵逼,然後就自習的研究了一下,先上 function createfunctions return result 呼叫最外層函式,接收返回的陣列 var arr createfunctions 迴圈遍歷陣列,呼叫每個元素並列印 for va...

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中的任何變數的最後乙個值。別忘了閉包所儲存的時整個變數物件,而不是某個特殊的變數。下面這個例子可以清晰地說明這個問題 function createfunction return result 這個函式返回的函式陣列中,所有函式的內部...

閉包與變數

作用域鏈的這種配置機制引出了乙個值得注意的 即閉包只能取得包含函式中任何變數的最後乙個值。閉包所儲存的是整個變數物件,而不是某個特殊的變數。function createfunctions return result 上述函式會返回乙個函式陣列。表面上看,似乎每個函式都應該返回自己的索引值,即位置0...