2011-08-16 74 views
-1

對不起,如果這是一個明顯的問題,但我相對較新的python,現在完全難倒了。我很難讓我的變量在我正在開發的程序中以我想要的方式工作。Python - 與變量的問題

這裏是我迅速作出向人們展示我的問題的例子:

life = 200 

def example(dudeHP): 
    dudeHP = dudeHP - 75 
    print (dudeHP) 

example(life) 
print (life) #output is 200, but I want it to be 125 

正如你所看到的,我試圖讓全局變量「生命」的價值,DEF例子的代碼塊裏面改變dudeHP(這將是一個局部變量,如果我沒有記錯?)

這是可行的?有沒有更好的方法來完成這一點?或者我做錯了什麼?三江源提前:)

+0

Python不支持按引用調用,只能按值調用。你將'200'的副本*傳遞給'example()',這就是它從'life'中減去'75'所得到的值。 –

+3

@Peter否.Python不會製作那樣的副本。他通過了一個參考文獻,他指出了「dudehp」這個名字的新值(125),而沒有重新指出或改變「生命」或其指向的價值。 – agf

+0

@agf它不會將'dudehp''指向一個新的值,而是指向一個新的**對象**。實際上,AFAI已經理解,標識符「dudehp」綁定到符號表中的一種指針(在Python中,'reference'這個詞是首選的,我不知道爲什麼),並且這種綁定關聯不會不會改變。唯一改變的是與dudehp相關的引用中的值,它是標識符間接指向的對象的地址。然後''dudehp = dudehp-75''觸發這個指針相關的地址變化,但不是符號表中的關聯 – eyquem

回答

3

嗯,首先,你可能會想要寫一個類或東西來組織這一切都在某個點。從函數或方法中修改全局變量通常被認爲是一個壞主意。

什麼,你可能想嘗試是這樣的:

life = 200 

def example(x): 
    return x - 75 

life = example(life) 

當然,在這種情況下,減法的操作是如此的微不足道,你不需要它封裝在一個函數。

0

在你的函數,名字dudeHP是本地的功能。當你改變它時,你只是改變本地名稱,你不能影響傳入的名字的值。

你可以讓整數成爲你傳入的容器的一個元素,這樣你就可以改變容器,或者你可以從函數返回值。

1

順便說一句,這個問題不是Python3特有的,除非一個新手被標題搞砸了。這是一個普通的Python語言問題。

您必須瞭解Python中變量的範圍和性質。變量只是名稱來保存某些值,並且它們的生命在它們定義的塊的範圍內,儘管內部範圍變量可以從外部範圍訪問變量。你定義的函數有自己的作用域和它自己的堆棧來維護,並且你將一個變量的副本傳遞給該函數。

應對這種情況的最好辦法是從函數的返回值作爲另一個答案指出。

說了這麼多,如果你真的想在一個全球性的方式來訪問的變量,你可以做這樣的。

a = 200 

def example(b): 
    global a 
    a = a - 25 

example(a) 
print a 

但這皺起了眉頭,而不是一個良好的作風。還有一個你正在使用的技巧,但是這超出了初學者的水平,它就是這樣。 A = [200]

def example(a): 
    a[0] = a[0] - 25 

example(a) 
print a[0] 

可以容易犯錯誤你,如果採取這種方式,

但是去了解這個正確的方法仍然是:

a = 200 

def example(b): 
    return b - 25 

print example(a) 
1

除了Ned Batchelders和Kristoff關於使用課程的提示和建議之外,您可以這樣做:

class Dude: 
    def __init__(self, hp=200): 
     self.hp = hp 

    def eat(self): 
     self.hp = self.hp + 25 

def example(dude): 
    dude.hp -= 75 

hero = Dude() 
example(hero) 
hero.eat() 
print(hero.hp) # 150 

除非你有一個很好的理由example應該是一個獨立的功能,你應該讓的Dudeeat的方法,因爲example明確作用,並在一定意義上屬於的類的對象Dude

0

由於dudehp在該函數中具有局部範圍,所以它不具有該函數之外的生命。因此,使用dudehp來更新人生是非法的,您可以通過使用全局關鍵字來實現這一點,或者像其他人所說的那樣迴應該值......希望這種解釋很有用,並且對此的任何更正都將被接受。