-1

當使用單個參數測試Python參數列表時,我發現一些奇怪的行爲與print帶單參數的Python參數列表

>>> def hi(*x): 
...  print(x) 
... 
>>> hi() 
() 
>>> hi(1,2) 
(1, 2) 
>>> hi(1) 
(1,) 

可以在任何一個給我解釋一下最後一個逗號在hi(1)的結果的含義(即(1,)

+2

這意味着打印的值是一個元組中包含一個元素的元組。 – Rockybilly

回答

1

其實行爲只是有點‘怪異’。 :-)

您的參數x前綴爲星號,這意味着您傳遞給該函數的所有參數將被「捲起」爲一個元組,並且x將爲該元組。

(1,)是Python的寫入一個值的元組的方式,用(1)對比它,這將是數字1。

下面是一個更一般的情況:

def f(x, *y): 
    return "x is {} and y is {}".format(x, y) 

這裏一些運行:

>>> f(1) 
'x is 1 and y is()' 
>>> f(1, 2) 
'x is 1 and y is (2,)' 
>>> f(1, 2, 3) 
'x is 1 and y is (2, 3)' 
>>> f(1, 2, 3, 4) 
'x is 1 and y is (2, 3, 4)' 

通知的第一個參數是如何去x和所有以後的參數被打包入T他元組y。你可能只是發現了Python代表0或1個元素的元組有點奇怪,但是當你意識到(1)必須是一個數字時纔有意義,所以必須有某種方法來表示單元元組。 Python只使用尾隨逗號作爲約定,就這些。

+0

我接受了你的答案,因爲'單元元組打印約定'的解釋。如果你能解釋爲什麼'(1)'被解釋爲數字'1',那將是非常值得的。 – transang

+1

當然,通常括號不會改變表達式的含義。例如,你可以說'4+(1)',它會是5,就像'4 *(2-1)'會是4一樣。因爲約定是用括號來表示子表達式的分組,所以Python的設計者認爲將意義超載爲意味着分組和單元元組將會太混亂。另外Python有一個'type'函數。實際上'type((2))'是'int','type((2,))'是'tuple'。我們不希望存在任何含糊不清的情況,如果把'(2)'當作元組來處理的話就不會有歧義。 –

+0

非常感謝您的詳細解答。我剛剛創建[新答案](http://stackoverflow.com/questions/40710455/why-single-element-tuple-is-interpreted-as-that-element-in-python)。讓我在這裏鏈接你的評論的答案 – transang