Re: [問題] 全域變數問題

作者: eight0 (欸XD)   2019-06-04 00:20:42
1. 你所說的「全域變數」其實是 module 的 property。在 python 中,module 是一個
物件,「全域變數」是物件上的屬性。
2. `global` 關鍵字只在 function 內有意義,會把指定的變數名稱 bind 到「全域變
數」。
3. 換句話說,在 A module 內使用 global foo 會指向 A.foo,在 B module 內使用
global foo 會指向 B.foo。
4. from ... import ... 的作用是「搜尋指定的 module」並「將指定 property 的值
assign 給目前 scope 內指定的變數」。如果把 from Name import MyVariable 寫
在 function 內,效果就是「把 Name.MyVariable 的值指定給區域變數
MyVariable」。
→ v00623: 所以全域變數不能放在不同模組? 那我main裡改的是區域? 06/03 17:54
Main.py 中修改的是 Main.MyVariable,不會影響 Name.MyVariable。可以把下面的
程式碼存成一個新檔案然後執行︰
import Main
import Name
print(Main.MyVariable, Name.MyVariable)
「區域變數」用來稱呼 function 內的變數。雖然定義在 module root 的變數不會在
不同的 module 中共用,我們還是把它們稱為 globals。
→ frank910138: 可以print(id(var)) 看 06/03 18:21
→ v00623: Id是相同的 06/03 22:37
id() 相同表示變數內的值是相同的,不表示你修改其中一個變數另一個變數也會變。
例︰
a = 1
b = 1
print(id(a), id(b), a, b)
b = 2
print(id(a), id(b), a, b)
作者: v00623 (阿哩他命EX PLUS)   2018-06-03 17:54:00
所以全域變數不能放在不同模組? 那我main裡改的是區域?
作者: frank910138 (frank)   2018-06-03 18:21:00
可以print(id(var)) 看
作者: v00623 (阿哩他命EX PLUS)   2018-06-03 22:37:00
Id是相同的
作者: iphone2003 (307)   2019-06-04 00:52:00
id那邊好像怪怪的,id()就是看變數記憶體位子沒錯,所以id相同代表相同物件。a=1,b=1的例子中id會一樣,是因為python有事先建立一些不可變且常用的物件,所以執行a=1時不會重新建立一個int物件,而是指向原本預先建立好的那個物件,同理b也一樣,所以a和b的id才會相同我沒記錯的話是這樣,有錯請見諒
作者: v00623 (阿哩他命EX PLUS)   2019-06-04 08:22:00
感謝回釋 不過id那邊我也記得是看記憶體位址 我再找找資料
作者: TuCH (謬客)   2019-06-04 08:59:00
是記憶體位置沒錯 如果 a=int(1) b=int(1) 那兩個id不相同
作者: TitanEric (泰坦)   2019-06-04 10:21:00
推iphone大
作者: v00623 (阿哩他命EX PLUS)   2019-06-04 14:26:00
eight0,謝謝你上面的解釋與後面的小範例,剛剛測試後有了解你說的意思了,我另外測試先import change再import a後,a就是1了,看來import順序決定他引用的時間,謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com