[英]How list unpacking works when passed as argument to function with variable parameters?
我有一個計算可變參數列表的算術平均值的函數。 它有一個位置參數和剩余變量參數。 所以代碼如下所示。
def mean(x, *l):
sum = x
for i in l:
sum += i
return sum / (1.0 + len(l))
現在我定義了一個包含 var 參數的列表
z = [1,2,3,4]
現在我調用我的函數
mean(*z) which prints 2.5 which is correct.
那么這里發生了什么? 我的理解是,當我執行 *z 時,它會解壓列表 z。 但是然后它如何從列表中選擇第一個位置參數並保持列表的其余部分完好無損以獲得函數 mean 中定義的“l”的長度。 是否解壓列表 z 只是為了從 z 中提取第一個元素然后保持 z 的其余部分原樣? 如果可以用列表來完成,那么如何?
另外,如果我單獨使用 z 作為參數調用該函數,則會引發錯誤
ari_mean(z) 回溯(最近一次調用最后一次):文件“”,第 1 行,在文件“”,第 5 行,在 ari_mean 中 TypeError:不支持的操作數類型 /:'list' 和 'float'
謝謝。
當你調用mean(*z)
,你是正確的,Python 解包z
,這意味着你的函數調用等效(在這種情況下),調用mean(1, 2, 3, 4)
現在,進入問題的第二部分:
是否解壓列表 z 只是為了從 z 中提取第一個元素然后保持 z 的其余部分原樣?
並不真地。 首先, z
被解包,每個參數分別傳入(如上所述)。 所以現在你讓我們看看 mean 的定義: def mean(x, *l):
。 這個定義需要至少一個位置參數 ( x
),而不是任意數量的額外參數。 因此,因為您對mean(*z)
初始調用變成了mean(1, 2, 3, 4)
,然后在您的mean
內部, x
等於1
並且*l
成為元組(2, 3, 4)
。
另外,如果我單獨使用 z 作為參數調用該函數,則會引發錯誤
如果你只是用 z 單獨調用函數( mean(z)
),那么,回到你的函數定義, x
將是列表[1,2,3,4]
而l
將是一個空元組。 因為l
是一個空元組,所以 for 循環中什么也沒有發生,你到了最后一行, return sum / (1.0 + len(l))
。 現在,因為x
是一個列表,Python 會引發異常,因為它不知道如何計算[1,2,3,4] / 1.0
運行下面的代碼可以向您展示它是如何工作的,注釋顯示了在函數中傳遞參數的方式。
def mean(x, *l):
sum=x
print("x:",x)
print("l:",l)
print("len(l):",len(l))
for i in l:
sum += i
return sum / (1.0+len(l))
z = [1,2,3,4]
print("1st call:")
print("result:",mean(*z)) ##x = z[0] and l=tuple(z[1:])
print("\n\n2nd call:")
print("result:",mean(z)) ##x = z and l = tuple()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.