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

看板Python作者 (人類)時間5年前 (2019/06/04 00:20), 5年前編輯推噓5(508)
留言13則, 4人參與, 5年前最新討論串2/2 (看更多)
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」。

06/03 17:54,
所以全域變數不能放在不同模組? 那我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。

06/03 18:21,
可以print(id(var)) 看
06/03 18:21

06/03 22:37,
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) -- 額外補充︰Python 沒有跨模組的的全域 "binding",但是你可以使用 builtins module 定義一個所有檔案都能存取的變數︰ import builtins builtins.MyVariable = 123 但是除非你有一個好理由,否則請不要這麼做。這個 module 是設計用來定義內建 函式和常數的。 -- 參考︰ * https://docs.python.org/3/library/builtins.html * https://docs.python.org/3/faq/programming.html#how-do-i-share-global-variables-across-modules (縮︰https://is.gd/zKqV2u) -- ヾ(;ω;) ヾ(;ω;) http://i.imgur.com/oAd97.png
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.225.8.82 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1559578849.A.7A5.html

06/04 00:52, 5年前 , 1F
id那邊好像怪怪的,id()就是看變數記憶體位子沒錯,
06/04 00:52, 1F

06/04 00:52, 5年前 , 2F
所以id相同代表相同物件。a=1,b=1的例子中id會一樣,
06/04 00:52, 2F

06/04 00:52, 5年前 , 3F
是因為python有事先建立一些不可變且常用的物件,所以
06/04 00:52, 3F

06/04 00:52, 5年前 , 4F
執行a=1時不會重新建立一個int物件,而是指向原本預
06/04 00:52, 4F

06/04 00:52, 5年前 , 5F
先建立好的那個物件,同理b也一樣,所以a和b的id才會
06/04 00:52, 5F

06/04 00:52, 5年前 , 6F
相同
06/04 00:52, 6F

06/04 00:53, 5年前 , 7F
我沒記錯的話是這樣,有錯請見諒
06/04 00:53, 7F

06/04 08:22, 5年前 , 8F
感謝回釋 不過id那邊我也記得是看記憶體位址 我再找找資料
06/04 08:22, 8F

06/04 08:59, 5年前 , 9F
是記憶體位置沒錯 如果 a=int(1) b=int(1) 那兩個id不相同
06/04 08:59, 9F

06/04 10:21, 5年前 , 10F
推iphone大
06/04 10:21, 10F
這兩件事實不衝突︰ id 相同時 => 值會相同 值相同時 => id 不一定相同 (定義一下何謂「相同的值」︰兩個物品擁有完全相同的形狀與內容) 我應該把「變數內的值」寫成「變數指向的物件」會更清楚。(註︰可以想成 Python 中的值都是物件,包括數字或字串。對變數 assign 時並不會覆寫舊的記憶體空間,而 是把變數指向新的物件。) id() 回傳的是物件的「唯一識別符號」,當兩個物件同時存在,且兩個物件的 id 都相 同時,代表兩個物件是同一個物件。(不同時期的物件可能會共用同個 id) 至於 id() 回傳的是記憶體位址也是正確的,不過這件事是 CPython implementation detail。 參考︰https://docs.python.org/3/library/functions.html#id 我想說明的是,物件的 id 和原 PO 的問題沒有太大的關係。原 PO 可以考慮以下的程 式碼︰ a = "123" b = a a = "" print(b) # result? 再考慮以下︰ # a.py a = "123" def change(): global a a = "" # b.py from a import a as b, change change() print(b) # result? 然後就是你的問題︰ # a.py a = "123" def change(): global a a = "" # b.py from a import a, change change() print(a) # result? ※ 編輯: eight0 (36.225.8.82 臺灣), 06/04/2019 12:34:57 ※ 編輯: eight0 (36.225.8.82 臺灣), 06/04/2019 12:42:15 ※ 編輯: eight0 (36.225.8.82 臺灣), 06/04/2019 12:43:48 ※ 編輯: eight0 (36.225.8.82 臺灣), 06/04/2019 12:50:40

06/04 14:26, 5年前 , 11F
eight0,謝謝你上面的解釋與後面的小範例,剛剛測試後有了解
06/04 14:26, 11F

06/04 14:26, 5年前 , 12F
你說的意思了,我另外測試先import change再import a後,a就
06/04 14:26, 12F

06/04 14:26, 5年前 , 13F
是1了,看來import順序決定他引用的時間,謝謝
06/04 14:26, 13F
文章代碼(AID): #1SzKZXUb (Python)
討論串 (同標題文章)
文章代碼(AID): #1SzKZXUb (Python)