有關python中變數的作用域理解

2021-09-28 23:21:52 字數 1806 閱讀 2511

author :

有關python中變數的作用域理解

例如:閉包的使用中分別用list列表變數和整形變數實現計數器

下列是計數器list列表變數的實現

def count(first=0):

cnt=[first]

def add_one():

cnt[0]+=1

return cnt[0]

return add_one

?️閉包計數器為什麼要用list變數? 用i整數變數為啥傳不進巢狀函式就會報錯error呢? 如下,,

下列是計數器整數變數的實現

def count():

cnt = 1

def add_one():

cnt += 1 # ⚠️error報錯

return cnt

return add_one

error 解釋是: 在閉包中count += 1,實際上是重新宣告了乙個count變數,覆蓋了外層函式的count變數,那麼此時這個count變數也沒有被賦值,卻參與到了運算當中,那麼就會報錯了。

?️為什麼在閉包裡通過nonlocal宣告一下就可以?

例如

def count(first=0):

cnt= first

def add_one():

nonlocal cnt

cnt += 1

return cnt

return add_one

原因:因為引用的變數的定義沒在內部函式裡面,而是在閉包裡面就可以通過nonlocal宣告一下,python就會從外層函式裡面找這個變數的定義了

【注意】:nonlocal的作用》:

from dis import dis#匯入dis模組

dis模組可以反彙編python函式的位元組碼

如果將沒有nonlocal會顯示反彙編結果為:

load_fast 0 (cnt2)

如果有nonlocal或使用列表會顯示反彙編結果為:load_deref 0 (cnt2)

load_fast 的含義是載入了本地變數

load_deref 的含義是載入了引用的變數

load_global 的含義是載入了全域性變數

如果函式內只引用全域性變數,但不修改時可以不使用global關鍵字 例:

cnt2 = 1

def counter():

def add_one():

a = cnt2 + 1

return a

return add_one

一旦對全域性變數進行修改必須宣告 例:

cnt3=1

def counter():

cnt3 = 1

def add_one():

global cnt3 # 宣告

cnt3 += 1 # 對全域性變數做修改

return a

return add_one

總:

list (因為是內建函式,所以他)的作用域預設是全域性。無論**進行了操作、處理,都是本身資料變更了。

整型等資料,需要先定義,然後才能使用;且預設的作用域是當前的區域性。

如果想用整型進行「計數器」的實現,需要宣告成 global 型別的變數。而且需要在函式外面就定義出來,不然就無法重置,

python中變數作用域

塊級作用域 if true a 10 變數沒有塊級作用域 print a 區域性作用域 只能在某一時刻才能使用 全域性作用域 num 20 def show 全域性變數在函式內部使用時,不能更改,num 10是你自己定義的變數 num 10 print num show print num 若更改需...

Python中變數作用域

在def中定義的變數都是區域性變數 def foo a 200print a def fooo a a 300print a fooo foo 執行得到 unboundlocalerror local variable a referenced before assignment也就是說在函式foo...

Python中變數的作用域

3 變數名解析legb法則 4 關鍵字global 在python程式中,建立,改變,查詢變數名的時候,都是在乙個儲存變數名的空間中進行,我們稱之為命名空間,也被稱之為作用域.簡單來說,變數的作用域就是指變數可以使用的範圍 程式的變數並不是在任意的位置都可以訪問,訪問許可權取決於這個變數是在 賦值的...