[PYTHON] 全局變量

應該儘可能避免使用全局變量。不一樣的模塊均可以自由的訪問全局變量,可能會致使全局變量的不可預知性。對全局變量,若是程序員甲修改了_a的值,程序員乙同時也要使用_a,這時可能致使程序中的錯誤。這種錯誤是很難發現和更正的。 python

全局變量下降了函數或模塊之間的通用性,不一樣的函數或模塊都要依賴於全局變量。一樣,全局變量下降了代碼的可讀性,閱讀者可能並不知道調用的某個變量是全局變量。程序員

可是某些時候,全局變量可以解決局部變量所難以解決的問題。事物要一分爲二。app

python裏面全局變量有兩種靈活的用法:函數

1 聲明法spa

在文件開頭聲明全局變量variable,.net

在具體函數中使用該變量時,須要事先聲明 global variable,不然系統將該變量視爲局部變量。blog

CONSTANT = 0  (將全局變量大寫便於識別)

def modifyConstant() : 
        global CONSTANT 
        print CONSTANT 
        CONSTANT += 1 
        returnip

if __name__ == '__main__' : 
        modifyConstant() 
        print CONSTANTget

2模塊法(推薦)input

把全局變量定義在一個單獨的模塊中:
#gl.py
gl_1 = 'hello'
gl_2 = 'world'

在其它模塊中使用
#a.py
import gl

def hello_world()
    print gl.gl_1, gl.gl_2

#b.py
import gl

def fun1()
    gl.gl_1 = 'Hello'
    gl.gl_2 = 'World'

第二種方法,適用於不一樣文件之間的變量共享,並且必定程度上避免了開頭所說的全局變量的弊端,推薦!

 

Python兩個內置函數——locals 和globals

locals 是隻讀的,globals 不是

這兩個函數主要提供,基於字典的訪問局部和全局變量的方式。
在理解這兩個函數時,首先來理解一下python中的名字空間概念。Python使用叫作名字空間的
東西來記錄變量的軌跡。名字空間只是一個字典,它的鍵字就是變量名,字典的值就是那些變
量的值。實際上,名字空間能夠象Python的字典同樣進行訪問


每一個函數都有着自已的名字空間,叫作局部名字空間,它記錄了函數的變量,包括函數的參數
和局部定義的變量。每一個模塊擁有它自已的名字空間,叫作全局名字空間,它記錄了模塊的變
量,包括函數、類、其它導入的模塊、模塊級的變量和常量。還有就是內置名字空間,任何模
塊都可訪問它,它存放着內置的函數和異常。


當一行代碼要使用變量 x 的值時,Python會到全部可用的名字空間去查找變量,按照以下順序:


1.局部名字空間 - 特指當前函數或類的方法。若是函數定義了一個局部變量 x,Python將使用
  這個變量,而後中止搜索。
2.全局名字空間 - 特指當前的模塊。若是模塊定義了一個名爲 x 的變量,函數或類,Python
  將使用這個變量而後中止搜索。
3.內置名字空間 - 對每一個模塊都是全局的。做爲最後的嘗試,Python將假設 x 是內置函數或變量。


若是Python在這些名字空間找不到 x,它將放棄查找並引起一個 NameError 的異常,同時傳遞
There is no variable named 'x' 這樣一條信息。


#局部變量函數locals例子(locals 返回一個名字/值對的字典。):

[python] view plain copy

 print?

  1. def foo(arg, a):  
  2.     x = 1  
  3.     y = 'xxxxxx'  
  4.     for i in range(10):  
  5.         j = 1  
  6.         k = i  
  7.     print locals()  
  8.   
  9.   
  10. #調用函數的打印結果    
  11. foo(1,2)  
  12. #{'a': 2, 'i': 9, 'k': 9, 'j': 1, 'arg': 1, 'y': 'xxxxxx', 'x': 1}  

一個globals的例子:

def set_global_table(table_name, data):
   
globals()[table_name] = data

def get_global_table(table_name):
    """
        get the content in the input table
    """
    try :
        print "table %s: %s" % (table_name,str(globals()[table_name]))
        return
globals()[table_name]
    except KeyError :
        print "No table named %s found" % table_name         return {}

相關文章
相關標籤/搜索