2014-05-13 26 views
0

希望我不重複任何問題,但找不到...如何保持鍵參數的默認值不變? (python)

我試圖用相同的鍵參數多次運行一個函數。我明白爲什麼f函數會更改x0數組,但我不太明白爲什麼g函數每次都有不同的參數(y0是常量)。 我會很感激,如果任何人都可以解釋我的這種行爲,並給我一個提示如何實現我想要的(基本上在最後我想有== == np.array([0,30,0]))。

import numpy as np 

x0 = np.zeros(3) 
y0 = np.zeros(3) 

def f(i, x = x0): 
    x[1] += i 
    return x 

def g(i, y = y0.copy()): 
    print "y that goes to g (every time is different) \n", y 
    y[1] += i 
    return y 

print "x0 before f \n" ,x0 
x = f(5) 
print "x0 after f is the same as x \n", x0, "\n", x 

print "y0 before g \n" ,y0 
for i in [10, 20, 30]: 
    y = g(i) 
print "y0 after g doe not change, but y is NOT as I would expect! \n", y0, "\n", y 
+0

'y0.copy()被創建並返回一個新的數組的函數時'還評價。同一個數組將用於每個函數調用。 – mgilson

+0

這不是重複的。這個問題有兩個部分,'x = x0'和'y = y0.copy()'。第一部分由前面的問題(OP已經理解)回答,但第二部分是新的。 –

+0

@HansThen - 但'y0.copy()'只是返回一個用作默認參數的可變對象。如果有區別,它是_really_ minimal(恕我直言)。雖然,我不得不承認,當StackOverflow在我的vote_之後標記爲dupe時,我感到震驚。通常需要5 ... – mgilson

回答

4

定義函數時,函數的默認參數僅計算一次。這意味着你的函數定義相當於:

y0_ = y0.copy() 
def g(i, y = y0_): 
    print "y that goes to g (every time is different) \n", y 
    etc 

這解釋了爲什麼你的y參數每次都改變。

+0

好吧,我沒有想到默認參數只被計算一次......這解釋了很多,基本上根據結果在函數'f'和'g'之間並沒有真正的區別(只是沒有改變初始值Y0)。在這個簡單的例子中,我將不得不復制循環中的'y0'數組。 –

+0

另一種方法是使用'None'作爲默認參數,然後使用'y = y if y else y0.copy()'或(less pythonic)'y = y或y0.copy()'。 –

+0

我認爲解決這個問題的最好方法是:def g(i,y = y0):y = y.copy()'。無論是否採用默認值,它都很簡單並且有效。 –

0

「但我真的不明白,爲什麼G功能需要每一次不同的觀點」

def g(i, y = y0.copy()): 
    .... 

你Y0是恆定的,而是要創建Y0的副本不同的參考第一次當G()函數被調用,所以你不能用函數g()改變y0。只要改變

y = y0.copy() 

y=y0