2017-01-10 86 views
0

我想在我的python代碼中擁有很少的全局變量。 然後用set函數設置它們的值,並希望通過get函數獲取它們的值。在python中獲取和設置值

例如:

a = None #global variable1 

b= None #global variable2 

def set(var, value): 
    var = value 

def get(var): 
    return var 

set(a, '1') 
get(b, '2') 

我想有一個通用的get和set功能,這會爲任何全局變量做到這一點。我如何在Python中做到這一點?這裏寫的代碼給出了錯誤。

回答

-1

如果您願意將變量名稱作爲字符串傳遞,則可以使用globals()函數執行此操作。但即使你可以,我認爲這不是一個好主意。

首先,這裏是你如何能做到這一點:

def get_var(var_name): 
    return globals()[var_name] 

def set_var(var_name, value): 
    globals()[var_name] = value 

我不使用名稱set因爲這是一個內置的類型,你可能不想用別的東西來的影子。

你會這樣稱呼它:

set_var("foo", 1) 

bar = get_var("foo") 

print(foo, bar) # prints 1 1 

所以它的工作原理,但真的沒有必要爲這些功能。您可以使用普通語法來分配或獲取全局變量。只需使用foo = 1而不是set_var("foo", 1)(如果您正在使用此功能,請先將global foo)。獲取全局變量就像命名它一樣簡單(就像我在print(foo)中那樣)。

如果您事先不知道變量名稱,則應該將名稱和值放入字典中,而不是將其作爲全局變量。變量名稱供程序員使用。他們不是數據!

+0

這不起作用。我獲得了全球宣稱的a和b的價值。我不喜歡這樣'一個= '' B = '' DEF get_var(VAR_NAME): 返回全局()[VAR_NAME] DEF set_var(VAR_NAME,值): 全局()[VAR_NAME] =值 set_var(一, '1') get_var的(a) 打印一個 set_var(b, '2') get_var(b) 打印B' –

+0

當調用'get_var'或'set_var',需要在名字周圍加上引號。如果你不這樣做,你會將這些變量的前一個值傳遞給函數,而不是將它們的名字作爲字符串。 – Blckknght

+0

它的工作。非常感謝你,但爲什麼它不是一個好主意?@Blckknght –

0

Python是「按值調用」而不是「按引用調用」。當您調用「set(a,'1')」時,意味着您將「a」的值傳遞給函數「set」。 「set」中的變量「var」是函數本身的局部變量,不會影響全局變量「a」。你需要給你的setter和getter方法訪問你的全局變量。你可以通過將它們全部作爲類對象的一部分來完成。

+2

在描述Python的工作方式時,我會非常小心地使用術語「按值調用」和「按引用調用」。它與支持這兩種語言的調用樣式(如C++)不一樣。我喜歡的描述是「傳遞指針值」。每個參數都是一個指向對象的指針,並且該指針在傳遞給函數時通過值(複製)傳遞。所以你不能重新綁定指針並將它反映到調用代碼中(因爲你只會修改你的副本),但是你可以改變被引用的對象,並且這些改變將在函數外部看到。 – Blckknght