2013-04-16 419 views
1

我正在閱讀John Zelle的Python編程2ed Ch6。我遇到一個概念問題: 他的示例代碼說:Python的函數返回

#addinterest3.py 
def addInterest(balances, rate): 
    for i in range(len(balances)): 
     balances[i] * (1 + rate) 


def test(): 
    amounts = [1000, 2200, 800, 360] 
    rate = 0.05 
    addInterest(amounts, rate) 
    print(amounts) 


test() 

與上代碼

「分配到列表中造成它指的是新價值的原有值,實際上 得到清理時Python做垃圾回收」

按照這個思路我嘗試了test.py

def add(balance, rate): 
    balance = balance * (1 + rate) 


def test(): 
    amount = 1000 
    rate = 0.5 
    amount = add(amount, rate) 
    print(amount) 


test() 

我認爲餘額也可以由一個新的值來分配,但事實證明在我的終端中返回「none」。任何人都可以解釋他們之間的根本區別是什麼? 爲什麼列表分配不需要使用return來傳遞值,但仍然會被保存,另一方面,我的test.py在函數之後需要「返回餘額」?

+0

是你的實際代碼?導致縮進是完全錯誤的。 – Serdalis

+1

'addInterest'中的代碼沒有副作用,也沒有顯式的返回值。具體而言,'balances [i] *(1 + rate)'不會修改任何值。鑑於上面的代碼,這是不正確的:「分配到列表中導致它重新考慮新值。」沒有分配到列表中。這將需要'餘額[我] * =(1 +利率)' – hughdbrown

+0

我只是複製了書上的內容。 – Iseng

回答

1

你是不是在amount得到任何值的原因是因爲你的add功能不返回任何東西。

def add(balance,rate): 
    return balance = balance*(1+rate) 

會返回一個值,該值將被分配給amount

除此之外,開頭的代碼是錯誤的。如果我們嘗試在Python這段代碼,你會發現它打印出:

[1000, 2200, 800, 360] 

需要將其改爲:

+0

我想我的問題是爲什麼如果函數中的參數必須通過值傳遞,但如果變量是一個列表,那麼你會發現你的「對象變化」在你的結果中變得「可見」(對不起,我是一個新手和不擅長英語,但這個問題真的讓我感到困惑) – Iseng

+0

Python不會傳遞每一個參數作爲參考,只有列表等。所以,即使你做了'增加(金額,比率)','金額'也不會改變。 Appart從那裏開始,你不能把'amount'賦給非返回函數的返回值,它只會放入一個'None'。如果你的問題中的代碼是在那本書中,**不要使用這本書**從[學習Python的艱難方式](http://learnpythonthehardway.org/book/)學習 – Serdalis

+0

謝謝,它真的幫助我。 – Iseng

0

你的add函數沒有return任何東西,所以Python自動在最後返回None。當你寫:

amount = add(amount,rate) 

add回報None,所以amount設置爲None。另外,並不是Python中的所有對象都是可變的,所以從函數內部修改變量不會達到你期望的效果。使用return代替:

def add(balance,rate): 
    return balance * (1 + rate) 
1

正如我可以預期,如果你傳遞一個列表作爲一個函數參數,就像你將指針傳遞給這個列表一樣。 Python中的賦值語句不會複製對象,它們會在目標和對象之間創建綁定。因此,如果您更改函數內的列表,您可以看到這些更改。如果傳遞變量,則這些變量的副本將在函數內部使用。
舉個例子,你也可以試試這個代碼:

a = [1, 2] 
b = a 
a.append(3) 
print a, b 

輸出:

[1, 2, 3] [1, 2, 3] 

跌宕!