第一段程式碼:
## -*- coding:gb2312 -*-
def get_wendu():
wendu = 22
print("您输入的温度是%d"%wendu)
return wendu
def get_wendu_huashi():
wendu = wendu + 3
print("您输入的新温度是%d"%wendu)
print("------1-------")
wendu = get_wendu()
print("------2-------")
get_wendu_huashi()
第一段程式碼執行結果:
#第二段程式碼:
## -*- coding:gb2312 -*-
def get_wendu():
wendu = 22
print("您输入的温度是%d"%wendu)
return wendu
def get_wendu_huashi():
result = wendu + 3 #这里是对第一段代码的修正,把前面一个wendu改成了新的变量名称result
print("您输入的新温度是%d"%result)
print("------1-------")
wendu = get_wendu()
print("------2-------")
get_wendu_huashi()
第二段程式碼執行結果:
#我有兩個問題:
第一個問題:
為什麼wendu = get_wendu()這句語句,執行出來的結果是:您輸入的溫度是22,這不只是一個賦值的語句麼?類似 wendu = 22,這樣一句賦值,不是不會印出來麼,為什麼wendu = get_wendu() 會印出結果,難道函數裡面的print語句,會在賦值的過程當中把這個東西印出來?
第二個問題:
為什麼第一段程式裡面wendu = wendu 3是錯誤的,換成result = wendu 3就能夠成功執行?是因為wendu = wendu 3這句話在執行的過程中,遇到print("您輸入的新溫度是%d"%wendu),系統無法分辨wendu到底是前面一個wendu還是後面一個wendu?
你的第一個問題其實是不懂語句的執行,wendu = get_wendu()這一句,get_wendu()這是一個表達式,它會回傳一個值,這個值會被賦值給wendu這個變量,而get_wendu ()這個表達式是執行函數,它會依序執行你函數體定義的語句,你在裡面寫了print,它自然會執行print。
你的第二個問題其實不懂局部變數和全域變數的差別,print什麼的一點影響都沒有,只是因為變數引用不同導致的。
先說你這裡能夠運作的語句。
這裡面,wendu 這個變數沒有在函數內部宣告定義,但是可以直接用,實際上引用的是全域變數wendu,也就是
wendu = get_wendu()
這裡定義的變數。這也解釋了result為啥印製的結果是22+3而你不能運作的語句
這裡實際上在函數內部作用域宣告了一個新變數 wendu,它尚未被定義,而後wendu+3裡的這個wendu變數就是引用了這個未定義的新變數,這自然而然的就造成了錯誤。
搞明白全域作用域和局部作用域就知道錯在哪裡了。
get_wendu()
是函數調用,調用get_wendu
,get_wendu
裡面print("您輸入的溫度是%d"%wendu)
裡面print("您輸入的溫度是%d"%wendu) 的值
wendu
這個變數還未定義,你就在使用它,由錯誤訊息就可以看出來,
UnboundLocalError: local variable 'wendu' referenced before boundLocalError: local variable 'wendu' referenced before' referenceprint("您輸入的溫度是%d"%wendu)
這句話不就是列印嗎python 預設會現在當前作用域尋找變量,由於在當前作用域沒有
wendu
這個變數自然也就報錯了。你可以在wendu = wendu + 3
前加上一句nonlocal wendu
,這樣就可以正常運行了print()函數是向標準輸出列印,
報錯訊息是
Local variable 'wendu' referenced before assignment
,說的是wendu變數在呼叫前 沒有使用。相信你如果翻譯了這個Error訊息一定會驚呆了呢,命名在wendu = get_wendu()聲明了但是竟然說沒有,但是計算機也沒有你想的那麼低能= =,=是用來賦值的,它一定知道wendu是哪個wendu。原因對於函數內部變數賦值,Python會認為這個變數是局部變量,所以你的wendu此時是一個局部變數並不是global
你可以嘗試這樣修改
變數名稱不要用拼音,變數名稱不要用拼音,變數名稱不要用拼音。全域變數盡量少用,依照你的要求,選擇傳參會比較好。