User Tools

Site Tools

study:python-topic:20241112-001:index

python — 怎麼在兩個檔案之間分享全域變數 (2024-11-12)

Locak Backup

  • 一般使用global variable 的情境是這樣的
  • tutorial1
    • <code python>num = 1

def increment(): global num num += 1</sxh>

  • 如此以來, 即使不透過傳遞num值到函式裡, 我們也可以將num這個值做增加的動作
  • 但今天有一個這樣的問題, 有兩個檔案
  • tutorial2
    • main.py
      from test import increment, num
      global num
      increment()
      print(num)
      test.py
      
      global num
      num = 0
      def increment(): 
       global num 
       num += 1
    • 結果是0
  • 這樣做就算另兩個檔案的num變為全域變數, 也無法改變原先在test.py的num值, 這邊與我們熟悉的程式語言c/c++ 與 java非常不同, 對我們曾經c++的王者來說一定更不習慣
  • 我們間接看一下, num的reference
  • tutorial3
    • main.py
      from test import increment, num
      print(‘before increment num in main.py, num address is {}’.format(id(num)))
      increment()
      print(‘final num value {} and address {}’.format(num, id(num)))
    • test.py
      global num
      num = 0
      print(‘import test.py, num address is {}’.format(id(num)))
      def increment():
       global num
       print(‘call by main.py, before increment, num address is {}’.format(id(num)))
       num += 1
       print(‘call by main.py, after increment , num address is {}’.format(id(num)))
    • result:
      before increment num in main.py, num address is 140467528860864
      call by main.py, before increment, num address is 140467528860864
      call by main.py, after increment , num address is 140467528860896
      final num value 0 and address 140467528860864
  • 可以注意到 這邊只要我們對這個num 值做了+的動作, 他立刻存到另外的記憶體位置, 但是卻沒有覆蓋回原本的global variable 的位址, 這細部可能要在看python 是如何去實作,而我們熟知的 c 語言有一個 extern 的方法可以讓我們輕鬆的解決這問題

在python中要如何解決呢

  • tutorial4
  • 我們必須在定義一個globals.py的檔案, 來儲存我們的全域變數
  • globals.py
    def initialize(): 
     global num 
     num = 1
  • main.py
    import globals 
    import test 
    if __name__ == “__main__”: 
     globals.initialize() 
     print( globals.num ) # print the initial value 
     test.increment() 
     print( globals.num ) # print the value after being modified within test.py
  • test.py
    import globals 
    def increment(): 
     globals.num += 1
  • results:
    1
    2
  • 如此我們便可以透過在宣告一個 globals.py 將我們要改變的全域變數放進裡面, 來讓所有程式都可以讀寫這個global variable

Permalink study/python-topic/20241112-001/index.txt · Last modified: 2024/11/12 08:53 by jethro

oeffentlich