こんにちはPyQサポートです。 今回はタプルのTypeErrorの意味とこのエラーが出る原因について解説します。
質問
TypeError: can only concatenate tuple (not "int") to tuple
というエラーが出てきました。自分が書いたコードは間違えてないように感じます。なぜ実行されないのでしょうか?
入力した内容(コード)
print((8, 1, 9) + (3))
出たエラー(実行結果)
Traceback (most recent call last): File "tuples_basic.py", line 1, in <module> print((8, 1, 9) + (3)) TypeError: can only concatenate tuple (not "int") to tuple
回答
このエラーは「タプルとタプル以外(int)を結合しようとしている」ことが原因で発生するエラーです。
タプルは、要素が一個の時は末尾にカンマが必要です(末尾にカンマがないと、数値扱いになります)。 このエラーはタプルと数値を結合しようとしていることが原因で表示されています。
このエラーをなくすために( 3 )
の後ろにカンマを追加しましょう。
print(( 8, 1, 9 ) + (3, ))
タプルの要素が一個しかないとき
タプルの()
は省略できます。
そのため以下のコードでも同じエラーが出ます。
a = 8, b = 1, c = 9 a + b + c
この時、aとbは、タプルです。 タプルは、「カンマで区切られた値」なので、丸括弧が省略できます。 そのため、上記と同じ理由でコンマが省略できません。
上記のコードは以下のどちらかにすると、エラーが出ません。
変数にint(整数)を代入した場合の結合
a = 8 b = 1 c = 9 a + b + c
【結果】
18
変数にタプルを代入した場合の結合
a = 8, b = 1, c = 9, a + b + c
【結果】
(8, 1, 9)
PythonでTypeErrorが出る時にチェックするといい、よくあるミス
- 誤った型の引数を渡していないか (今回の場合は、タプルが期待されるのに、intが渡された)
- 引数の数が正しいか
- タプルの要素が一個の時、末尾にカンマがあるか(末尾にカンマがないと、数値扱いになります)
TypeErrorの類似記事の紹介
TypeError: must be str, not int
このエラーは、「int型ではなくstr型でなければなりません」ということを伝えています。
+記号
を利用し、異なる型同士での結合しようとする時にこのエラーが表示されます。
TypeError: list indices must be integers or slices, not str
このエラーは、「リストから要素を取り出すときに [] の中に文字列を指定できません。数値かスライスを指定する必要があります」ということを伝えています。インデックスに文字列が入っている時にこのエラーが表示されます。
TypeError: 'int' object is not iterable
このエラーは、「繰り返しに使えないオブジェクトを繰り返し処理で使っている」ということを伝えています。 for文のinの後ろにiterable(リストやタプルなど要素を繰り返し可能なオブジェクト)ではないint(整数)型のオブジェクトを指定したために表示されたエラーです。