Pythonの「'int'オブジェクトと'str'オブジェクトを連結できません」エラーの原因と解決方法
Pythonで文字列フォーマットを行う際、「TypeError: cannot concatenate 'int' object and 'str' object」('int'オブジェクトと'str'オブジェクトを連結できません)というエラーに遭遇することがあります。この記事では、このエラーが発生する理由と具体的な解決方法をわかりやすく解説します。
エラーが発生する原因
このエラーの背景には、演算子の優先順位が関係しています。例えば、次のようなコードを書いたとします。
print("\nNum %d" % i+1)
Pythonインタープリタは、% 演算子を + 演算子よりも先に処理します。そのため、上記のコードは実際には以下のように解釈されます。
print(("\nNum %d" % i) + 1)
つまり、%d がまず変数 i の値に置き換えられ、その結果得られた文字列に対して整数の 1 を足そうとします。Pythonでは文字列と整数を直接連結することはできないため、この時点でエラーが発生してしまうのです。
解決方法:括弧で囲む
この問題を解決する最もシンプルな方法は、i+1 を括弧で囲むことです。こうすることで加算が先に実行され、その計算結果が %d に渡されるようになります。
print("\nNum %d" % (i+1))
これで、意図したとおり「i に 1 を足した値」が正しく表示されます。
より現代的な書き方
Python 3では、format() メソッドやf文字列(f-string)を使うことで、より読みやすく安全なコードを書けます。
# format()メソッドを使用
print("\nNum {}".format(i+1))
# f文字列を使用(Python 3.6以降)
print(f"\nNum {i+1}")
特にf文字列は、式を波括弧の中に直接書けるため、% フォーマットのような演算子の優先順位によるミスが起こりにくく、可読性も大きく向上します。
まとめ
「cannot concatenate 'int' object and 'str' object」というエラーは、% フォーマットが + よりも先に評価されるため、文字列と整数を直接連結しようとしたことが原因です。対処法としては、(i+1) のように式全体を括弧で囲めばOKです。今後のコーディングでは、f文字列などの新しいフォーマット手法を活用すると、この種のエラーを未然に防ぎやすくなります。
-
Pythonでチェスのナイトが盤内に留まり続ける確率を求めるプログラム
n、x、y、k の4つの値が与えられたとします。n は n×n のチェス盤のサイズ、(x, y) はナイトが置かれている初期座標、k はナイトが正確に動く手数を表します。ナイトは各手ごとに、8方向のいずれかへ等しい確率でランダムに移動します。求めたいのは、k 手動いた後もナイトがチェス盤の中に留まっている確率(最も近い整数に丸めたパーセント値)です。ただし、一度でも盤の外に出てしまうと、その後は二度と盤に戻れないという条件があります。 例えば、入力が n = 8、(x, y) = (1, 1)、k = 1 の場合を考えてみましょう。8×8 のチェス盤の (1, 1) に置かれたナイトが、ちょ
-
Macで「ディスクをアンマウントできませんでした」エラーが出る原因と対処法を徹底解説
macOSに標準搭載されている「ディスクユーティリティ」は、ディスクに関するさまざまな問題を診断・修復できる便利なシステムツールです。アプリが頻繁に強制終了する、外付けドライブが正常に動作しない、Macが起動しないといったトラブルが発生した際に、ディスクの検証を実行することで、ハードドライブの健康状態をチェックし、可能であればディスクエラーを修復してくれます。通常はスムーズに動作するディスクユーティリティですが、ときにはエラーが発生して処理が完了できないこともあります。その中でも特によく見られるのが「ディスクをアンマウントできませんでした(Couldnt Unmount Disk)」というエラ