2014-07-27 51 views
1

有人可以解釋爲什麼,當我多次調用這個函數時,默認情況下L從來沒有設置爲空?但是,任何後續調用的結果是L追加到前面調用的所有結果?爲什麼在函數被多次調用時爲Python 3函數設置的默認值會被覆蓋?

該功能將數據分離成7天塊,與所述最後日期開始([:: - 1]), 計算每7天平均值和追加的結果作爲值 列表。忽略不完整的塊

數據的默認值是序號格式的日期列表。

def separate(data = [i for i in w][::-1],L = []): 
    print("separate has been called, data is %s and L is %s" % (data, L)) 

    if len(data)<7: 
     return L 

    total = 0 
    dates = 0 

    for value in data[:7]: 
     if w[value] != "None": 
      total += float(w[value]) 
      dates += 1 
    L.append(total/dates) 

    return separate(data[7:], L) 
+0

我覺得它有什麼要直接添加更改列表值,但L的定義只應該在函數的範圍內,對不對? – Anon

+0

w是什麼?有什麼改變嗎? –

+0

w是指向包含日期的配置文件中的某個節的變量。默認數據值是所有這些數據顛倒的列表理解。但是數據的價值保持不變,這似乎是L的價值。 – Anon

回答

2

the documentation摘自:

默認值只計算一次。當默認值是可變對象(如列表,字典或大多數類的實例)時,這會有所不同。

[...]

如果你不想被後續調用之間共享默認這樣做,你可以這樣寫,而不是功能:

def f(a, L=None): 
    if L is None: 
     L = [] 
    L.append(a) 
    return L 
+0

謝謝,現在我覺得有點蠢。可能是其中一個默認值保持不變的事實讓我感到惱火。 – Anon

+0

我應該如何在遞歸函數中實現它?檢查L是[]是不可能的,因爲L應該在遞歸期間保存值... – Anon

+0

這個例子檢查'L'是否是'None',這很容易。在你的例子中,你爲'L'提供了一個實際參數,所以默認值不再重要。 – Stefan

相關問題