python內部函式,引用全域性變數以及修改全域性變數的相關測試。
總結:內部函式,不修改全域性變數可以引用全域性變數
內部函式,修改同名全域性變數,則python會認為它是乙個區域性變數
在內部函式修改同名全域性變數之前呼叫變數名稱(如print sum),則引發unbound-localerror
python訪問區域性變數和全域性變數的規則:當搜尋乙個變數的時候,python先從區域性作用域開始搜尋,如果在區域性作用域沒有找到那個變數(這裡有個疑問待確認:就是如果區域性中沒找到該變數,直譯器會不會到上一層或者全域性中查詢),直譯器就會丟擲異常(nameerror或者unbound-localerror,這取決於python版本。)
測試:
# 情況1 正常命令執行 修改變數值# python直譯器預設是從上往下執行的 如果沒有預先定義變數 而直接呼叫修改變數 直譯器會在第一次查詢變數沒有找到的時候 丟擲下方變數沒有定義的異常 而此時已經不再往下執行
# x=x+1# x=888# 此步驟沒有意義,因為在上步出現異常後,就不會走到這一步了
# print(x) # nameerror: name 'x' is notdefined
# 情況 2函式中 修改變數值
# x = 6# 定義全域性變數
# def func():
# x = 1# 此時修改同名的全域性變數x python直譯器實際上是把x當成了乙個新的區域性變數 對其賦值
# returnx
# print(x) #從輸出結果來看,全域性變數此時並沒有被修改
# print(func()) # 返回新的區域性變數x的值
# # 輸出結果
# # 6# # 1# 情況 3# x = 6# 定義全域性變數
# def func():
# x = x + 1# 當函式被呼叫執行時候,python直譯器會先從func函式中查詢 x變數,
# # 但是在引用x之後,發現x並沒有被預先定義。也就是如下直譯器的報錯:在定義之前被應用了。
# # unboundlocalerror: local variable 'x'referenced before assignment
# #x = 888 # 其實加不加x=888這一步 已經沒有意義 因為根本就走不到這一步 這裡,模擬情況1 非函式中的執行。(這裡暫時先這麼理解,有待確認:直譯器是先讀到x=888還是根本不走這一步)
# returnx
# print(x)
# print(func())
# # 輸出結果
# # unboundlocalerror: local variable 'x'referenced before assignment
# 情況 4# 接著情況3異常 如果我們確實要在區域性函式中修改同名全域性變數 該如何操作? 這裡需要做乙個申明。
# x = 6# 定義全域性變數
# def func():
# global x # 申明 x為全域性變數
# x = x + 1# 當函式被呼叫執行時候,python直譯器先從func函式中查詢 x變數,先讀到x為全域性變數的申明。
# # 然後引用x=6對該變數進行賦值操作。
# returnx
# print(x) # 輸出全域性變數x 此時該值並沒有發生變化,還是6,說明func函式引用全域性變數的時候,只是暫時引用一下,重新賦值的x會被當作乙個區域性變數
# print(func()) # func()函式執行後,輸出的結果為7
# 輸出結果
# 6# 7# 情況 5# x = 6# 定義全域性變數
# def func():
# global x # 此處申明下x為全域性變數
# x = 1# 此時修改同名的全域性變數x python直譯器就把x當成全域性變數 對其重新賦值更改
# returnx
# func()
# print(x) # 從輸出結果來看,全域性變數被修改
# print(func()) # func函式中的變數x也被修改
# 輸出結果
# 1# 1
參考:
python函式中的變數修改問題
先挖個坑,改日再補 參考中的內容 和其他語言不一樣,傳遞引數的時候,python不允許程式設計師選擇採用傳值還是傳引用。python引數傳遞採用的肯定是 傳物件引用 的方式。實際上,這種方式相當於傳值和傳引用的一種綜合。如果函式收到的是乙個可變物件 比如字典或者列表 的引用,就能修改物件的原始值 相...
全域性變數在函式內部的修改
接下來,先看兩個例子 例子一 g num 0 def test1 global g num g num 10 print test1後 g num為 d g num def test2 g num 0 g num 20 print 在test2裡 g num為 d g num def main pr...
異常型別 異常變數的生命週期
傳智掃地僧課程學習筆記。這是原始的錯誤處理方式,int my strcpy char to,char from if to null if from a while from 0 to 0 return 0 void main if to null copy是的 場景檢查 if from a whi...