author :
有關python中變數的作用域理解
例如:閉包的使用中分別用list列表變數和整形變數實現計數器
下列是計數器list列表變數的實現?️閉包計數器為什麼要用list變數? 用i整數變數為啥傳不進巢狀函式就會報錯error呢? 如下,,def count(first=0):
cnt=[first]
def add_one():
cnt[0]+=1
return cnt[0]
return add_one
下列是計數器整數變數的實現error 解釋是: 在閉包中count += 1,實際上是重新宣告了乙個count變數,覆蓋了外層函式的count變數,那麼此時這個count變數也沒有被賦值,卻參與到了運算當中,那麼就會報錯了。def count():
cnt = 1
def add_one():
cnt += 1 # ⚠️error報錯
return cnt
return add_one
?️為什麼在閉包裡通過nonlocal宣告一下就可以?
例如
def count(first=0):原因:因為引用的變數的定義沒在內部函式裡面,而是在閉包裡面就可以通過nonlocal宣告一下,python就會從外層函式裡面找這個變數的定義了cnt= first
def add_one():
nonlocal cnt
cnt += 1
return cnt
return add_one
【注意】:nonlocal的作用》:
from dis import dis#匯入dis模組
dis模組可以反彙編python函式的位元組碼如果函式內只引用全域性變數,但不修改時可以不使用global關鍵字 例:如果將沒有nonlocal會顯示反彙編結果為:
load_fast 0 (cnt2)
如果有nonlocal或使用列表會顯示反彙編結果為:load_deref 0 (cnt2)
load_fast 的含義是載入了本地變數
load_deref 的含義是載入了引用的變數
load_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程式中,建立,改變,查詢變數名的時候,都是在乙個儲存變數名的空間中進行,我們稱之為命名空間,也被稱之為作用域.簡單來說,變數的作用域就是指變數可以使用的範圍 程式的變數並不是在任意的位置都可以訪問,訪問許可權取決於這個變數是在 賦值的...