當使用單個參數測試Python參數列表時,我發現一些奇怪的行爲與print
。帶單參數的Python參數列表
>>> def hi(*x):
... print(x)
...
>>> hi()
()
>>> hi(1,2)
(1, 2)
>>> hi(1)
(1,)
可以在任何一個給我解釋一下最後一個逗號在hi(1)
的結果的含義(即(1,)
)
當使用單個參數測試Python參數列表時,我發現一些奇怪的行爲與print
。帶單參數的Python參數列表
>>> def hi(*x):
... print(x)
...
>>> hi()
()
>>> hi(1,2)
(1, 2)
>>> hi(1)
(1,)
可以在任何一個給我解釋一下最後一個逗號在hi(1)
的結果的含義(即(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只使用尾隨逗號作爲約定,就這些。
我接受了你的答案,因爲'單元元組打印約定'的解釋。如果你能解釋爲什麼'(1)'被解釋爲數字'1',那將是非常值得的。 – transang
當然,通常括號不會改變表達式的含義。例如,你可以說'4+(1)',它會是5,就像'4 *(2-1)'會是4一樣。因爲約定是用括號來表示子表達式的分組,所以Python的設計者認爲將意義超載爲意味着分組和單元元組將會太混亂。另外Python有一個'type'函數。實際上'type((2))'是'int','type((2,))'是'tuple'。我們不希望存在任何含糊不清的情況,如果把'(2)'當作元組來處理的話就不會有歧義。 –
非常感謝您的詳細解答。我剛剛創建[新答案](http://stackoverflow.com/questions/40710455/why-single-element-tuple-is-interpreted-as-that-element-in-python)。讓我在這裏鏈接你的評論的答案 – transang
這意味着打印的值是一個元組中包含一個元素的元組。 – Rockybilly