2013-01-21 140 views
3

我是一個初學Python的編程人員,對於我來自Java來說有些跳躍。我現在的問題是關於在Python中對常量等使用全局變量。 在Java中,我們那種有兩個想法,常量,我們可以有這樣的事情:Python全局變量用法

private static final HOME_URL_CONST = "localhost:8080"; 

或者,如果我們需要將值在運行時分配:

private static HOME_URL = ""; 
public void init(){ 
    HOME_URL = "localhost:8080"; 
} 

的一點是,在後者的情況下,一旦你設置了靜態變量,它就保持設置。但是在Python中,情況並非如此。如果我創建一個全局變量,然後將其分配給一個函數,那麼該變量將只在該函數內部具有賦值的值。 現在,我有這樣的事情:

def initialize(): 
    global HOME_URL 
    with open("urls.txt", 'rb') as f: 
    HOME_URL = json.load(f.read())['urls'] 

這是這樣的一個可以接受的方法,還是有一些影響和副作用,我不知道的?

+0

這很好。 Python是動態的,所有變量值也是如此。 Python中沒有「靜態最終」等價物。 –

+3

[認爲有害的全局變量](http://c2.com/cgi/wiki?GlobalVariablesConsideredHarmful) –

回答

6

在Python中,由於其動態性質,沒有定義const變量本身。常數通過樣式決定,並且因此從PEP 8

常數引用通常安裝在一個模塊級別定義和寫入用下劃線分離詞語所有 大寫字母。示例包括 MAX_OVERFLOW和TOTAL。

所以,如果你想有一個變量作爲常數,在模塊級用大寫字母用下劃線分開定義,命名,並按照約定,以便有任何其他範圍內沒有其他變量衝突與恆定的變量。 在任何情況下,您都不需要任何全侷限定符,因爲在模塊級定義的變量在任何情況下都會在函數級範圍內。

因此,在這種特殊情況下

HOME_URL = "localhost:8080" 
def initialize(): 
     #global HOME_URL #You don't need this 
     home_url = HOME_URL 
     with open("urls.txt", 'rb') as f: 
      #Constants are not supposed to mutate 
      home_url = json.load(f.read())['urls']