1,局部變數與全局變數 1,定義 局部變數:就是在函數體內的變數,在python中冒號“:”後面的變數都是局部變數,當然局部與全局也是一個相對的概念。比如出現函數嵌套的情況。 全局變數:就是在模塊中所有函數都可以調用的變數,一般在函數體外被定義。 2,使用過程 函數內的局部變數,在函數體外是不可以使 ...
1,局部變數與全局變數
1,定義
局部變數:就是在函數體內的變數,在python中冒號“:”後面的變數都是局部變數,當然局部與全局也是一個相對的概念。比如出現函數嵌套的情況。
全局變數:就是在模塊中所有函數都可以調用的變數,一般在函數體外被定義。
2,使用過程
函數內的局部變數,在函數體外是不可以使用的,函數內的變數就是局部變數,只在函數體內生效。

例如,這裡的discount(price,rate)函數,兩個形式參數price和rate,還有final_price都是函數的局部變數。
如果在函數體外使用就會出錯。
全局變數,比如這裡的old_price,rate和new_price都是全局變數。因此可以在函數體內訪問他們。在python中,可以肆無忌憚地在函數體內部使用全局變數,但是如果在函數體內修改全局變數則會出錯。



其實,當在函數體內部調用全局變數時,是可以正常使用的,
但是當在函數體內部修改全局變數時,python是在函數體內部新創建了一個同名的局部變數,所以當我們在函數體內部列印該變數時,是修改後的值,但是當在程式外部列印正常的全局變數時,發現值並沒有被修改。正如小甲魚解釋的一樣。
如果一定要在函數體內部修改全局變數,可以在變數名前加 global關鍵字,如下所示:

3,註意事項
註意:python出現這種現象是一種程式的保護機制,因為全局變數在很多地方都會使用,不建議在函數體內部修改全局變數,如果有這一類的操作,會導致程式很難維護。就像這裡小甲魚說的一樣。

如果你已經知道在函數中修改全局變數可能會導致可讀性變差、出現莫名其妙的BUG、代碼的維護成本成倍提高,但還是要堅持這麼做,可以用global關鍵字來實現。
但是,如果遇到這種情況,思考一下,為什麼要這麼做,能不能把變數的位置挪到函數內部,讓它變成局部變數。如果可以,就不要使用全局變數,然後再函數里修改的操作。
