-1

引数が1つのPythonパラメータリストをテストすると、printという奇妙な動作があります。 引数が1つのPythonパラメータリスト

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

はいずれも、最後のコンマは hi(1)の結果に何を意味するか私に説明してもらえます(すなわち (1,)

+2

これは、印刷された値がその内部に単一の要素を持つタプルであることを意味します。 – Rockybilly

答えて

1

実際に行動が少しだけある 『奇妙な。』 :-)

パラメータxには接頭辞が付きます。つまり、関数に渡す引数はすべて1つのタプルに「ロールアップ」され、xはそのタプルになります。

(1,)ここ数1

されるであろう、(1)とを対比するために、Pythonはつの値の組を書き込む方法がより一般的なケースである:ここ

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

いくつかの実行は以下のとおりです。最初の引数はxになり、後続のすべての引数をtにパックされているか

>>> 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)' 

お知らせ彼はタプルyです。 Pythonが0または1のコンポーネントを持つタプルを少し奇妙に表現する方法を見つけただけかもしれませんが、(1)が数字でなければならないことがわかってから、単一要素のタプルを表現する方法がなければなりません。 Pythonはコンベンションとして末尾のカンマを使用します。それだけです。

+0

私はあなたの答えを 'single-element tuple printing convention'の説明のために受け入れました。なぜ '(1)'が数字 '1'と解釈されるのか説明することができれば、とてもうれしいでしょう。 – transang

+1

確かに、括弧では表現の意味は変わりません。例えば、あなたは '4 +(1)'と言うことができ、 '4 *(2-1)'は4と同じように5になります。規約では部分式をグループ化するために括弧を使うため、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

関連する問題