2012-12-04 47 views
2

可能重複:
Python: How do I pass a variable by reference?修改參數,如蟒蛇副作用

我想寫修改傳遞的參數之一的函數。下面是當前的代碼:

def improve_guess(guess, num): 
    return (guess + (num/guess))/2 

x = 4.0 
guess = 2.0 
guess = improve_guess(guess, x) 

不過,我想編寫的代碼中,使得我沒有做最後的分配方式。這樣,我可以撥打:

improve_guess(guess,x) 

並獲得猜測中的新值。我有意沒有提及通過引用,因爲在我的網絡搜索過程中,我發現了很多有關該主題的學術討論,但沒有這樣做的乾淨方式,我並不想使用全局變量或者封裝在一個列表中)。

+4

'improve_guess(3,x)' - 你將如何修改'3'? – eumiro

+0

我們通常在C和Java中使用參數傳遞來引用。這樣,'guess'參數就成爲發送參數的別名。 – recluze

+0

哦,我明白你的意思了,但我的用例只會處理變量。 – recluze

回答

6

你不能直接這樣做,因爲整數和浮點類型在Python中是不可變的。

可能guess換成某種可變結構(例如列表或自定義類),但這會非常快速地變得非常難看。

P.S.我個人非常喜歡guess = improve_guess(guess, x)的明確性質,因爲它確切地修改了什麼。我甚至不需要知道任何關於improve_guess()的數據。

3

但是這些是唯一的兩種方法:使用全局的,或者使用像列表這樣的可變類型。你不能在Python中修改一個非可變變量:這樣做只是將本地名稱重新綁定到一個新值。

如果你真的不喜歡在列表中包裝,你可以創建自己的類並傳遞一個可變的實例,但是我看不到任何好處。

+0

「這樣做只是將本地名稱重新綁定爲新值」賦值始終將變量重新綁定爲新值。它與可變或不可變無關。 「你不能在Python中修改非可變變量」變量不可變或不可變 - 變量指向的對象可以是變量。但是說你不能修改一個不可變的對象是一種重言式。 – newacct