我有一個代碼,我正在學習,我完全卡在這裏。Python包裝關鍵字參數與*
代碼:
def f(*a):
print a
print (*[1,2]) # prints (1,2)
爲什麼?我不知道這背後的過程。我知道*args
將可變長度參數轉換爲元組,但是(*[1,2])
的性能如何?
我有一個代碼,我正在學習,我完全卡在這裏。Python包裝關鍵字參數與*
代碼:
def f(*a):
print a
print (*[1,2]) # prints (1,2)
爲什麼?我不知道這背後的過程。我知道*args
將可變長度參數轉換爲元組,但是(*[1,2])
的性能如何?
我想你想,而不是寫:
print f(*[ 1, 2]) # Python 2
print(f(*[ 1, 2])) # Python 3
的*
做什麼,是一種叫unpacking。在這種情況下,你在哪裏拆包的清單。它通常用來傳遞列表作爲「獨立」參數的功能,例如:
def f(a, b):
print a
print b
你可以這樣調用它
f(*[1, 2]) # with unpacking
這相當於
f(1, 2)
但不解壓只發生在你打電話給拉鍊(*東西)? *本身是否也執行該操作?或者正在解壓縮一個不同的解包概念? – user3467433
完全不同。只是玩它,你會找出原因。請注意,當你做'zip(* stuff)'時,你首先解壓縮和壓縮。每個過程都不同。 – Christian
這稱爲參數解包 - 參見參考at the documentation。
簡而言之,print f(*[1,2])
獲取列表中的每個元素,並將其作爲單個參數傳遞給方法f
。
方法f
需要多個位置參數,它們在正文中被分配名稱a
。
因此,當您鍵入f(*[1,2])
時,這與f(1,2)
相同。在另一邊,f
接收1,2
的元組a
並打印:
>>> def f(*a):
... print(a)
...
>>> f(*[1,2])
(1, 2)
是否缺少最後一行的函數調用?您的代碼不會按原樣運行。 – Blender
是啊,似乎是這樣.. – user3467433