2010-01-11 92 views
2

我正試圖在程序中進一步更改一個變量。我有一個在程序開始時聲明的全局變量,我想在程序中改變不同函數中的變量。我可以通過在函數內再次聲明變量來做到這一點,但我想知道是否有更好的方法來做到這一點。一些測試代碼在下面解釋我的意思。如何在Python中更改變量

ID = 'No' 
project = ("Yep"+ID) #ID added with no value which I later want to change 

def pro(): 

    ID = "YES" 
    print ID 

def pro1(ID): 

    #I could declare project again to get this to work, but I would like to avoid this 
    print project # I want this to print with the new ID number. 

if __name__ == '__main__': 
    pro() 
    pro1(ID) 

有任何人任何想法,

我已經嘗試了「全局」變量感謝,但我這樣做時,該項目的變量還是打印出「YepNo」而不是「YepYES」。我希望函數'pro'中的新變量改變'project'變量中的變量。

+0

你想讓項目的價值改變嗎?如果是這樣的話,那麼你應該爲它做一個課。 – 2010-01-11 10:07:41

+3

與這個問題沒有關係,但是我通過將本地「myObject」設置爲沒有返回語句的函數的返回值來確定。這有效(價值設置爲無),但它是沒有意義的,是一個WTF,讓人想到「他到底在想什麼」。 – ddaa 2010-01-11 10:12:13

+2

字符串在Python中是不可變的。在執行字符串連接時,如在「項目」分配中,您正在創建一個新字符串。您以後無法通過更改ID的值來更改「項目」。 – 2010-01-11 10:13:16

回答

4

要更新全局變量,你可以到ID分配變量之前使用

global ID 
ID="Yes" 

=「YES」

但改變ID將在項目變量,project = ("Yep"+ID)沒有影響,因爲項目已經是一個字符串

你需要做一個函數喜歡

def getprojectname(ID): 
    return project+ID 

整個程序可能是這樣

UPDATE: ...刪除

+0

要更改全局變量,應該聲明爲全局變量。 – 2010-01-11 10:43:51

+2

我認爲這個例子的代碼風格非常糟糕......即使你回答了這個問題,你也鼓勵了一個不適當的編程。 – 2010-01-11 11:41:48

+1

是的,這是正確的,我知道,我只是不想觸摸他的代碼,現在刪除。 – YOU 2010-01-11 11:47:51

2

使用global聲明。

全局聲明是一個適用於整個當前代碼塊的聲明。這意味着列出的標識符將被解釋爲全局變量。

實施例:http://www.rexx.com/~dkuhlman/python_101/python_101.html#SECTION004340000000000000000

P.S.

但不要用global過於頻繁,看到http://www.youtube.com/watch?v=E_kZDvwofHY#t=10m45

+0

這隻能解決這個代碼中的一些問題:例如,它並沒有改變「項目」在第二行被分配了它的值並且從不改變的事實,並且OP想要的是「項目'在ID變化時更新。 – 2010-01-11 10:20:38

-1

你可以不發生突變重新分配:

variables = {} 
def pro(): 
    if variables['ID'] == '': 
     variables['ID'] = 'default' 
6

當心,你錯了多次這樣做。

即使您可以使用全局語句來更改全局(由於最好使用函數參數和返回值,所以不鼓勵使用),但它不會更改其他已分配的值。例如。即使您重新分配ID,您也不會重新分配項目。另外:你的函數什麼都不返回,給它的返回值賦一個名字沒有意義,而且對於一個變量來說,這是一個壞的習慣,因爲它是一個將常量用於常量的約定。

這應該澄清你的方式全球工程:

myid = '' 
project = ("Yep"+myid) #ID added with no value which I later want to change 

def mutate_id(): 
    global myid 
    myid = "YES" 

def mutate_project(): 
    global project 
    project = ("YEP" + myid) 

if __name__ == '__main__': 
    print "myid", myid 
    print "project ", project 
    print 

    mutate_id() 

    print "myid", myid 
    print "project ", project 
    print 

    mutate_project() 

    print "myid", myid 
    print "project ", project 
    print 

但是,最好的辦法是做無全局:

def get_new_id(old): 
    return "YES" 

def get_new_project(old): 
    return ("YEP" + myid) 

if __name__ == '__main__': 
    myid = '' 
    project = ("Yep"+myid) 

    print "myid", myid 
    print "project ", project 
    print 

    myid = get_new_id(myid) 

    print "myid", myid 
    print "project ", project 
    print 

    project = get_new_project(project) 

    print "myid", myid 
    print "project ", project 
    print 

這將使所有代碼互動清楚,防止相關問題全球狀態變化。

+0

爲了擴展一個小點:立即計算'project =(「Yep」+ ID)':將變量'ID'擴展爲字符串''No'',並附加到'「Yes」字符串「YepNo」,它立即分配給變量「project」。稍後更改'ID'不會產生任何效果,因爲'project'已經有了它的價值。 – 2010-01-11 10:18:46

+0

是的,我直接在OP上發表評論:-) – 2010-01-11 11:39:24

1

在你的代碼有兩個問題。首先關於改變ID變量,這可以通過使用全局來解決。

你的代碼計算項目字符串的第二個項目,然後項目不知道ID。

爲避免代碼重複,您可以定義函數來計算項目。

因此,我們有:

ID = 'No' 
def GetProject(): 
    return "Yep"+ID 

def pro(): 
    global ID 
    ID = "YES" 
    print ID 

print GetProject() 

pro() 

print GetProject() 
0

爲什麼不使用詞典?

>>> attr = {'start':'XXX', 'myid':'No'} 
>>> 
>>> def update_and_show(D, value = None): 
...  if value: D['myid'] = value 
...  print D['start'] + ' ' + D['myid'] 
... 
>>> update_and_show(attr) 
XXX No 
>>> update_and_show(attr, 'Yes') 
XXX Yes 
>>> update_and_show(attr, 'No') 
XXX No 
>>>