2019年8月14日 星期三

Python (偽) 全域變數 淺談與應用

以下內容皆以Python 3.5為例,測試環境為Spyder 3.3.0

其實Python是沒有全域變數的
也沒有常數

但其實有一種類似"全域常數"的方式可以應用

以下先給一個在class的範例

首先我們在程式一開始建立了變數a=5

1.可以看到在執行read_ok(15行),程式能夠讀取來自class外的變數 a

2.執行write_type_1(16行),我們在裡面做了一次a = 10,列印出來的a也是10
    問題出在(17行),我們在執行write_type_1之後,列印"a",確認變數 a是否被修改
    列印的結果為5,證實class外面的a,並沒有被修改,write_type_1裡面的a是新建立的

3.在來是挺有趣的測試,write_type_2(18行),程式會報錯
   因為你在裡面嘗試"寫入"到變數a,程式認為你想要建立一個變數 a
   所以認定write_type_2中的變數 a跟class外面的變數 a沒有關係
   但指令是a = a + 1,write_type_2裡面沒有變數 a的初始值,因此報錯


再給一個副程式版本的與執行結果


因為執行結果一樣就不再解釋一次

結論

以上面read_ok的執行結果來看,這樣的應用比較像"全域變數"
要達到這個功能,必須嚴守一個規定"不能在class或副程式裡面""嘗試覆寫"

應用範例:
假設你的程式要丟到網路給大家使用,可以在程式一開始設定一些參數(常數)
給使用者設定這些"執行後不會有變化"的參數
像pygame中的背景顏色,就很適合這種方式

補充

這邊補充一個說明

一樣先在外面建立一個變數 a
引入變數 a,並執行write_type_2,列印出來的變數 a為10
但執行完write_type_2,再列印一次變數 a得到a = 5
這是因為在程式眼中a = a + 1
a是新建立的區域變數

正確用法

不要重複命名




沒有留言:

張貼留言