- Python
‘int’ object is not iterableの原因と直し方|再現20例
結論
TypeError: 'int' object is not iterable は「1個ずつ取り出せないもの(整数)を、for文や sum・list などに渡した」ときのエラーです。いちばん多いのは for i in 5: や for i in len(a): の range() の書き忘れです。直し方は、エラーの行で渡した値を print(type(x), x) で表示し、「回数」なのか「データの集まり」なのかを決めることから始まります。
この記事でわかること
- このエラーになる原因20種と、原因ごとの再現コード・エラー原文・直したあとの出力
- NoneType・float・bool・numpy.int64 で出る同じ形のエラーと、iterable と iterator の違い
- 実行前に見つける方法(mypy)と、どの直し方を選ぶかの判断表
この記事で実際に動かしたもの:エラーを出すコード44本と直したコードを Python 3.13 で実行し、NumPy・pandas を使わない35本を 3.14・3.12・3.11 でも動かして文言を比べ、IPython 9.18.1 で表示を確かめ、mypy 2.4.1 で実行前に見つかるかを確かめました。
flowchart TD
E[not iterable] --> T[type と値を表示]
T --> N{型は?}
N -->|int| R[range]
N -->|None| F[return]
N -->|関数| P[かっこ]
やりたいことごとに、いちばん早い方法を先にまとめます。
| やりたいこと | いちばん早い方法 | 詳しい節 |
|---|---|---|
| 'int' object is not iterable の意味を知りたい | 整数は1個ずつ取り出せない。for・sum・list に数を渡した | エラーの意味 |
| for文で n 回くり返したい | for i in range(n): |
原因1〜3 |
for i in len(a) で出た |
for x in a か enumerate(a) |
原因1〜3 |
| cannot unpack non-iterable int object が出た | 左辺の数と右辺の値の数をそろえる | アンパック |
| 'NoneType' object is not iterable が出た | 呼んだ関数に return があるか見る |
戻り値がNone |
| 数字の各桁を回したい | for d in str(n): |
桁・JSON・NumPy |
| 'function'・'method' object is not iterable が出た | 呼び出しの () を付ける |
かっこ忘れ・自作クラス |
| 実行前に見つけたい | 型ヒントを書いて mypy を通す | iterableか確かめる方法 |
確認環境:Ubuntu 24.04.5 LTS の上で、Python 3.13.18 を主に使い、エラーを出すコード(for文に整数・len() の結果・sum/max/list/set/sorted/enumerate/zip/map への整数・extend と +=・アンパック・辞書のループ・戻り値が None・list.sort() の戻り値・整数の桁・JSON の数値・NumPy と pandas の集計結果・再帰・メソッドのかっこ忘れ・自作クラス・yield from・* での展開など)を1本ずつ実行してトレースバックの原文を取り、直したコードの出力も同じ環境で取りました。同じコードを Python 3.14.6(作業用の場所に uv で導入)・3.12.3・3.11.18 でも実行して文言を比べ、Jupyter と同じ表示は IPython 9.18.1、実行前の検出は mypy 2.4.1(どちらも作業用の仮想環境に導入)で確かめました。判定方法の速さは timeit で100万回×5回を測った最小値です。iterable と iterator の定義は Python 公式ドキュメント(用語集・組み込み関数 iter・collections.abc)で確かめました。Windows・Mac では実行していませんが、このエラーの文言と原因は OS に依存しない Python 本体の動作です。図は mermaid で描画を確かめています(確認日 2026年11月5日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「'int' object is not iterableの原因と直し方|再現20例」
TypeError: 'int' object is not iterableの意味(エラー文の読み方)
この節では、エラー文の日本語訳と、「iterable(イテラブル)」が何を指すかが分かります。
「TypeError: 'int' object is not iterable」を日本語にすると「型のエラー:int(整数)のオブジェクトは反復可能ではありません」です。 「反復可能(iterable)」は「中身を1個ずつ順に取り出せる」という意味です。Python 公式ドキュメントの用語集は iterable を次のように説明しています。
An object capable of returning its members one at a time.(要素を1つずつ返すことのできるオブジェクト)
リスト・タプル・文字列・辞書・集合・range は中身を1個ずつ取り出せますが、14 のような整数には「中身」がありません。手元で、整数を for文に渡すと次のように止まりました。
count = 14
for i in count:
print(i)
Traceback (most recent call last):
File "/srv/s4/r17/t295/s/c01_for_int.py", line 2, in <module>
for i in count:
^^^^^
TypeError: 'int' object is not iterable
エラー文の3つの部品
| 部品 | 意味 | この例では |
|---|---|---|
| TypeError | 値の型が、その操作に合っていない | for文には「取り出せる型」が要る |
| 'int' | 実際に渡された値の型の名前 | count の中身が整数だった |
| object is not iterable | 1個ずつ取り出せない | 整数には要素が無い |
引用符の中の型名が変わるだけで、同じ仕組みのエラーがいくつもあります。 手元では 'NoneType' object is not iterable(値が None)、'float' object is not iterable(小数)、'bool' object is not iterable(True・False)、'numpy.int64' object is not iterable(NumPy の数)、'function' object is not iterable(関数そのもの)が出ました。どれも「そこに入っている値は、思っている型ではない」という知らせです。
n 回くり返すとき
for i in 5:。整数そのものは取り出す中身が無いfor i in range(5):。range は 0〜4 を1個ずつ返す覚え方:回数は range に入れてから回す
not iterableの原因一覧(20種)と自分の場合の見分け方
この節では、このエラーになる原因の全体像と、エラーの行から原因を絞り込む手順が分かります。
原因は「回数のつもりの数を回した」「データの集まりのつもりが数(や None)だった」の2系統に分かれます。 手元で再現した20種を、その2系統と出る文言で並べました。
| 原因 | 系統 | 出る文言(最後の行) | 直し方の要点 |
|---|---|---|---|
1. for i in 14 | 回数 | 'int' object is not iterable | range(14) |
2. for i in len(a) | 回数 | 'int' object is not iterable | for x in a・enumerate |
3. range(2.5) | 回数 | 'float' object cannot be interpreted as an integer | int() で整数にする |
4. sum(5) | 集まり | 'int' object is not iterable | sum([5]) |
5. max(7)・min(7) | 集まり | 'int' object is not iterable | リストを渡す |
6. list(5)・set(10)・sorted(42)・dict(5) | 集まり | 'int' object is not iterable | [5]・{10} |
7. enumerate(3)・zip(a, 3)・map(str, 123) | 集まり | 'int' object is not iterable | リストか str() |
8. items.extend(3)・items += 3 | 集まり | 'int' object is not iterable | append(3) |
9. a, b = 10 | 集まり | cannot unpack non-iterable int object | 値の数をそろえる |
10. for k, v in d(キーが整数) | 集まり | cannot unpack non-iterable int object | d.items() |
| 11. 1個しか返さない関数を2つに分けた | 集まり | cannot unpack non-iterable int object | return a, b |
| 12. 戻り値の無い関数を回した | None | 'NoneType' object is not iterable | return を書く |
13. nums = nums.sort() | None | 'NoneType' object is not iterable | sorted(nums) |
| 14. 見つからないとき None を返す関数をアンパック | None | cannot unpack non-iterable NoneType object | None を先に判定 |
| 15. 整数の各桁を回した | 集まり | 'int' object is not iterable | str(n) |
| 16. JSON の数値の項目を回した | 集まり | 'int' object is not iterable | 件数と一覧の項目を分ける |
17. NumPy・pandas の sum() の結果を回した | 集まり | 'numpy.int64' object is not iterable | 集計前の列を回す |
| 18. 再帰関数が整数を返した | 集まり | 'int' object is not iterable | return [x] |
19. d.keys・get_users のかっこ忘れ | 型違い | 'builtin_function_or_method'・'function' object is not iterable | () を付ける |
20. __iter__ の無い自作クラス | 型違い | 'Cart' object is not iterable | __iter__ を書く |
回数のつもりの数を回した
for に整数・len() の結果をそのまま渡した
range の書き忘れ
直し方は range を付けるか、要素で回す
集まりのつもりが数・None だった
関数の戻り値・JSON・集計結果・再帰
sum・list・アンパックの引数
直し方はデータの出どころを見直す
自分の場合を3つの手順で絞り込む
自分で確かめる①:トレースバックの一番下の、自分のファイルの行を見る
Python 3.11 以降は、エラーの行の下に ^ の印が付き、取り出せなかった値を指します。for i in len(values): なら len(values) の下に印が付きました。
自分で確かめる②:エラーの行の直前で型と値を表示する
f文字列の = を使うと式と値をまとめて出せます。手元では print(f"{type(x)=} {x=}") が type(x)=<class 'int'> x=14 と表示し、整数が入っていると分かりました。
「回数」か「集まり」かを決める
くり返す回数として使いたいなら range を付けます。データの集まりが入っているはずなら、その値を作った関数・JSON・計算を調べます。
原因1〜3:for文に数やlen()を渡した(rangeの書き忘れ)
この節では、for文で 'int' object is not iterable が出るいちばん多い形と、range を使わない書き方が分かります。
原因1:for i in 整数
前の節の for i in count: の形です。range() で包むと 0 から count−1 までを1個ずつ返すので、手元では 3 回くり返す例が 0 1 2 を出しました。
count = 3
for i in range(count):
print(i, end=" ") # 0 1 2
ユーザーの入力から回数を受け取る場合も同じで、for i in range(int(input())) と書きます。input() の結果は文字列なので、int() を付けずに for i in input() と書くとエラーにはならず、入力した文字を1文字ずつ回す別のバグになります。
原因2:for i in len(a)
検索上位の記事でも取り上げられている、数を数える関数の例です。len() は「個数」という1個の整数を返すので、そのままでは回せません。
def count_occurrence(values, to_find):
n = 0
for i in len(values):
if values[i] == to_find:
n += 1
return n
print(count_occurrence([1, 2, 3, 3], 3))
Traceback (most recent call last):
File "/srv/s4/r17/t295/s/c02_len.py", line 8, in <module>
print(count_occurrence([1, 2, 3, 3], 3))
~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
File "/srv/s4/r17/t295/s/c02_len.py", line 3, in count_occurrence
for i in len(values):
~~~^^^^^^^^
TypeError: 'int' object is not iterable
トレースバックは下から読みます。一番下の File の行(3行目の for i in len(values):)がエラーの起きた場所で、その上は呼び出し元です。直し方は3通りあり、手元ではどれも 2 を返しました。
# 1. range で包む(番号が要るとき)
for i in range(len(values)):
if values[i] == to_find: ...
# 2. 要素で回す(番号が要らないとき。こちらが短い)
n = sum(1 for v in values if v == to_find)
# 3. 用意されたメソッドを使う
n = values.count(to_find)
番号を自分で計算する range(len(a)) は、範囲を1つ間違えると別のエラー(IndexError)につながります。 番号も要るなら for i, v in enumerate(values): と書くと、範囲を計算せずに済みます。for文と range の書き方は関連記事「Python for文とrangeの使い方|1始まり・逆順・enumerate早見表」で扱っています。番号がずれたときの IndexError は、第49弾の「list index out of rangeの原因と直し方|Python再現10例」で扱う予定です。
原因3:range() に小数を渡した
range を付けても、中身が小数なら別の文言で止まります。平均や割り算の結果(/ は必ず小数を返す)を回数に使うと起きます。
for i in range(2.5):
~~~~~^^^^^
TypeError: 'float' object cannot be interpreted as an integer
回数は整数にしてから渡します。切り捨てなら int(x) か、割り算を //(切り捨ての割り算)にします。小数そのものを for に渡した場合は 'float' object is not iterable、True・False を渡した場合は 'bool' object is not iterable になりました。
原因4〜8:sum・max・listなどの関数に数を渡した
この節では、for文を書いていないのに 'int' object is not iterable が出る理由と、関数ごとの直し方が分かります。
sum・max・min・list・set・tuple・dict・sorted・enumerate・zip・map・extend は、どれも中で for文と同じ「1個ずつ取り出す」処理をしています。 そのため、引数に整数を渡すと同じ文言で止まります。手元で1つずつ出した原文です。
| 出したコード | エラー原文 | 直したコードと出力 |
|---|---|---|
sum(5) | TypeError: 'int' object is not iterable | sum([5]) → 5 |
max(7) | TypeError: 'int' object is not iterable | max([7]) → 7 |
list(5) | TypeError: 'int' object is not iterable | [5] か list(range(5)) |
set(10)・sorted(42)・dict(5) | TypeError: 'int' object is not iterable | {10}・sorted([42]) |
enumerate(3) | TypeError: 'int' object is not iterable | enumerate(range(3)) |
zip([1, 2], 3) | TypeError: 'int' object is not iterable | 両方をリストにする |
map(str, 123) | TypeError: 'int' object is not iterable | map(int, str(123)) |
items.extend(3) | TypeError: 'int' object is not iterable | items.append(3) |
items += 3 | TypeError: 'int' object is not iterable | items += [3] |
関数の中で出ると、呼び出し元が原因
自分で書いた関数の中で sum を使っていると、エラーの行は関数の中を指しますが、原因は呼び出し元の引数です。
def total(values):
return sum(values)
print(total(5))
Traceback (most recent call last):
File "/srv/s4/r17/t295/s/c03_sum.py", line 4, in <module>
print(total(5))
~~~~~^^^
File "/srv/s4/r17/t295/s/c03_sum.py", line 2, in total
return sum(values)
TypeError: 'int' object is not iterable
一番下の行(return sum(values))だけを見ると sum が悪いように見えますが、1つ上の行の total(5) が整数を渡しています。 手元では、この return sum(values) の行には ^ の印が付きませんでした。印は「行の一部」が原因のときに付き、行全体が1つの式のときは省かれます。1個だけの値を渡すなら total([5]) とリストで包みます。
append と extend の取り違え
append は「1個を末尾に足す」、extend と += は「集まりの中身を全部足す」です。1個の整数を足すなら append を使います。手元では items = [1, 2] に items.append(3)、続けて items += [4] として [1, 2, 3, 4] になりました。items += 3 の行は、3.13 でも ^ の印が付かない形で表示されました。
random.choices は別の文言になる
検索上位の記事では random.choices の引数の取り違えも原因に挙がっていますが、手元の Python 3.13 では random.choices(3, ["red", "blue"]) が TypeError: object of type 'int' has no len() になり、not iterable とは別の文言でした。choices は最初に len(population) を呼ぶためです。正しくは random.choices(["red", "blue"], k=3) で、手元では(乱数の種0で)['blue', 'blue', 'red'] が返りました。
原因9〜11:アンパックで出る cannot unpack non-iterable int object
この節では、a, b = ... の形で出る文言の違いと、辞書のループ・関数の戻り値での直し方が分かります。
「cannot unpack non-iterable int object」は「取り出せない整数を、複数の変数に分けようとした」という意味です。 文言は for文のときと違いますが、仕組みは同じです。
a, b = 10
^^^^
TypeError: cannot unpack non-iterable int object
原因10:辞書を for k, v in d で回した
辞書をそのまま for で回すと、取り出されるのはキーだけです。キーが整数だと、1個の整数を k と v に分けようとして止まります。
scores = {1: 80, 2: 45}
for k, v in scores:
print(k, v)
Traceback (most recent call last):
File "/srv/s4/r17/t295/s/c11_dict.py", line 2, in <module>
for k, v in scores:
^^^^
TypeError: cannot unpack non-iterable int object
キーと値の組を取り出すのは scores.items() です。手元では 1 80 | 2 45 | と出ました。キーが文字列の辞書で同じ書き方をすると、文字列が1文字ずつ分けられます。手元では {"ab": 1, "cde": 2} で、2文字のキー "ab" は a b とエラー無しに分かれてしまい、3文字の "cde" で ValueError: too many values to unpack (expected 2) になりました。エラーにならない分だけ気づきにくいので、辞書を2つの変数で回すときは .items() と覚えておきます。
原因11:1個しか返さない関数を2つに分けた
def minmax(a):
return min(a) # 1個しか返していない
lo, hi = minmax([3, 1, 2]) # TypeError: cannot unpack non-iterable int object
return min(a), max(a) と書くと、カンマで区切った値はタプルとして返り、2つの変数に分けられます。手元では lo, hi が 1 3 になりました。リストの中の要素を回すときに出る場合(for a, b in [get_pair(), get_pair()] で get_pair が整数を返す)も、同じ文言でした。
11個だけ受け取る書き方
a, = (10,) のように末尾にカンマを付けると、要素1個のタプルから取り出せる。
22つ返す標準の関数
divmod(17, 5) は商と余りの組を返すので、手元では a, b = divmod(17, 5) が 3 2 になった。
3* で余りを受け取る
first, *rest = [1, 2, 3] は数が合わなくても止まらない。ただし右辺が整数なら同じエラーになる。
原因12〜14:関数の戻り値がNone('NoneType' object is not iterable)
この節では、None で同じエラーが出る3つの典型と、None を返す関数の扱い方が分かります。
Python の関数は、return を書かないと None を返します。 その戻り値を for で回すと 'NoneType' object is not iterable になります。整数の場合よりも原因が離れた場所にあるので、気づきにくい形です。
原因12:return の書き忘れ
def load_users():
users = ["tanaka", "suzuki"]
print(len(users), "users")
for u in load_users():
print(u)
2 users
Traceback (most recent call last):
File "/srv/s4/r17/t295/s/c05_none.py", line 5, in <module>
for u in load_users():
~~~~~~~~~~^^
TypeError: 'NoneType' object is not iterable
「2 users」は表示されたので関数は動いていますが、結果を返していません。最後に return users を足すと、手元では tanaka suzuki と出ました。
原因13:nums = nums.sort()
list.sort() はリストをその場で並べ替え、None を返します。手元で print(nums.sort()) は None を表示しました。戻り値を代入すると、リストが None に置き換わります。
for n in nums:
^^^^
TypeError: 'NoneType' object is not iterable
並べ替えた結果を使うとき
nums = nums.sort()。sort は None を返すので、nums が None になるnums.sort() だけ書くか、new = sorted(nums)。手元では sorted が [1, 2, 3] を返し、元の nums は [3, 1, 2] のままappend・extend・reverse・remove も None を返す
原因14:見つからないときだけ None を返す関数
見つかったときだけ return key, value を書いた関数は、見つからないと最後まで進んで None を返します。
k, v = find({"a": 1}, "b")
^^^^
TypeError: cannot unpack non-iterable NoneType object
見つからないことがありうるなら、受け取る側で None を先に判定します。
def find(d, key):
if key in d:
return key, d[key]
return None # 見つからないときを明示する
r = find({"a": 1}, "b")
if r is not None:
k, v = r
else:
print("not found") # 手元の出力:not found
None の判定を if r: ではなく is not None で書く理由は、関連記事「Python None判定はis Noneで|空文字・空リスト・0との違い早見表」で扱っています。None に [0] を付けたときのエラーは関連記事「NoneType object is not subscriptableの直し方」、None のメソッドを呼んだときのエラーは関連記事「'NoneType' object has no attributeの直し方」で扱っています。3つとも「None が入っている」という同じ根を持つので、出た場所ではなく None を作った場所を探します。
原因15〜18:整数の桁・JSONの数値・NumPyとpandasの集計結果
この節では、データの読み込みや集計のあとで出る 'int' object is not iterable と、型が想定とずれる場所が分かります。
原因15:整数の各桁を回した
「2026 の各桁の和」のように桁を1つずつ扱いたいとき、整数のままでは回せません。
for d in n:
^
TypeError: 'int' object is not iterable
文字列にすると1文字ずつ取り出せます。手元では次の2通りがどちらも 10 を返しました。
n = 2026
print(sum(int(d) for d in str(n))) # 10
print(sum(map(int, str(n)))) # 10
原因16:JSON の「件数」の項目を回した
API の応答では、件数(整数)と一覧(リスト)が並んで返ることがよくあります。
import json
payload = json.loads('{"count": 2, "items": ["a", "b"]}')
for x in payload["count"]: # TypeError: 'int' object is not iterable
print(x)
手元で type(payload["count"]).__name__ は int でした。くり返すなら range(payload["count"])、中身を回すなら payload["items"] と、項目の役割で使い分けます。手元では 0 1 a b と出ました。API によっては、1件のときはリストでなく1個の値、0件のときは null(None)を返すものもあるので、受け取った直後に型を確かめておくと原因の場所が近くなります。
原因17:NumPy・pandas の集計結果を回した
NumPy・pandas の sum()・mean() は1個の数を返します。型名が Python の int ではなく numpy.int64 になるので、文言が少し変わります。
for x in df["age"].sum():
~~~~~~~~~~~~~^^
TypeError: 'numpy.int64' object is not iterable
0次元の配列(np.array(5))を回した場合は、さらに別の文言 TypeError: iteration over a 0-d array でした。手元の NumPy 2.5.3・pandas 3.0.5 での出力と直し方です。
| コード | 結果 | 直し方 |
|---|---|---|
np.array([1, 2, 3]).sum() を for | 'numpy.int64' object is not iterable | 集計前の配列を回す |
np.array(5) を for | iteration over a 0-d array | np.atleast_1d(a) → [5] |
df["age"].sum() を for | 'numpy.int64' object is not iterable | for x in df["age"] → 20 30 |
| 1個の数を Python の int にしたい | エラーではない | s.item() → 6 |
原因18:再帰関数が整数を返した
入れ子のリストを平らにする関数で、「整数ならそのまま返す」と書くと、呼び出し元の extend が整数を受け取ります。
File "/srv/s4/r17/t295/s/c25_rec.py", line 6, in flatten
out.extend(flatten(e))
~~~~~~~~~~^^^^^^^^^^^^
TypeError: 'int' object is not iterable
関数の戻り値の型を、どの分岐でもそろえるのが直し方です。return x を return [x] にすると、手元では flatten([1, [2, 3]]) が [1, 2, 3] を返しました。「ある分岐では整数、別の分岐ではリスト」という関数は、原因14の None と同じく、呼んだ側で突然止まります。
原因19・20:かっこの付け忘れと、自作クラスの not iterable
この節では、'function'・'method'・自作クラスの名前で出る not iterable と、自分のクラスを for で回せるようにする方法が分かります。
原因19:メソッド・関数の () 忘れ
かっこを付けないと、関数は呼ばれず「関数そのもの」が渡されます。手元で出た原文です。
| 出したコード | エラー原文 | 直したコード |
|---|---|---|
for k in d.keys: | 'builtin_function_or_method' object is not iterable | d.keys() |
for u in get_users: | 'function' object is not iterable | get_users() |
for x in list: | 'type' object is not iterable | 変数名を確かめる |
for x in re.search(...) | 're.Match' object is not iterable | m.groups()・re.findall |
'type' object is not iterable は、list・dict という型の名前そのものを回したときの文言です。変数名に list を使うつもりで書き間違えたときなどに出ます。正規表現の結果は、手元では re.search(r"(\w+)=(\d+)", "id=42").groups() が ('id', '42')、re.findall(r"\d+", "a1 b22") が ['1', '22'] を返しました。
原因20:__iter__ の無い自作クラス
自分で作ったクラスは、何もしなければ for で回せません。エラーにはクラス名が出ます。
for x in Cart():
~~~~^^
TypeError: 'Cart' object is not iterable
__iter__ メソッドで、中のリストのイテレーター(次の節で説明)を返すと回せるようになります。in での判定も同時に使えるようになりました。
class Cart:
def __init__(self):
self.items = ["apple", "milk"]
def __iter__(self):
return iter(self.items)
print(list(Cart()), "milk" in Cart()) # ['apple', 'milk'] True
__iter__ をジェネレーター(yield を使う関数)で書く方法もあります。ジェネレーターの書き方は関連記事「Pythonジェネレータとyield|使い所とメモリ比較コード集」で扱っています。
iterableとiteratorの違い(iter・next・ジェネレーター)
この節では、エラー文に出る iterable と、よく似た iterator の違いと、「エラーは出ないのに2回目が空になる」落とし穴が分かります。
iterable は「1個ずつ取り出せるもの」、iterator は「取り出している途中の位置を覚えている係」です。 for文は、iterable を iter() に渡して iterator を受け取り、next() で1個ずつ取り出し、終わりの合図(StopIteration)で止まります。公式ドキュメントの用語集も「for 文はこれを自動で行う」と説明しています。
nums = [1, 2, 3]
it = iter(nums)
print(type(it).__name__) # list_iterator
print(next(it), next(it), next(it)) # 1 2 3
next(it) # StopIteration
| 観点 | iterable(リストなど) | iterator(iter の結果・ジェネレーター) |
|---|---|---|
| for で回せる | 回せる | 回せる |
| next() を呼べる | 呼べない('list' object is not an iterator) | 呼べる |
| 2回回すと | 2回とも全部取り出せる | 2回目は空(エラーにならない) |
| iter() に渡すと | 新しい iterator が返る | 自分自身が返る |
| 例 | list・tuple・str・dict・set・range | iter(リスト)・ジェネレーター・ファイル |
手元で next([1, 2, 3]) を実行すると TypeError: 'list' object is not an iterator でした。文言の最後が「iterable」か「an iterator」かで、意味が違います。 not iterable は「そもそも回せない」、not an iterator は「回せるが next() は直接呼べない」で、後者は next(iter(nums)) と書けば動きます。
2回目が空になる落とし穴
ジェネレーター式は iterator なので、1回使い切ると空になります。エラーは出ません。
g = (x * 2 for x in [1, 2, 3])
print(list(g), list(g)) # [2, 4, 6] []
2回使うなら、list() でリストにして保存するか、クラスに __iter__ を書いて毎回新しい iterator を作ります。手元では、前の節の Cart と同じ作りのクラスで list(c), list(c) が2回とも同じ中身を返しました。
iterableかどうかを確かめる方法(iter・isinstance・mypy)
この節では、値が回せるかをプログラムで判定する3つの方法の違いと、実行する前に型チェッカーで見つける方法が分かります。
手元で、よく使う型を3つの方法で判定した結果です。
| 値の型 | hasattr(x, "__iter__") | isinstance(x, Iterable) | iter(x) |
|---|---|---|---|
| list・tuple・str・dict・set・range・bytes | True | True | 成功 |
| int・float・bool・NoneType | False | False | TypeError |
__getitem__ だけを持つ自作クラス | False | False | 成功([0, 10, 20]) |
3行目が判定方法の差です。 Python 公式ドキュメント(collections.abc)は、isinstance(obj, Iterable) は __getitem__ で回すクラスを検出しないとし、「iterable かどうかを確実に判定する唯一の方法は iter(obj) を呼ぶこと」と書いています。手元でも、__getitem__ だけのクラスは isinstance が False なのに list() で [0, 10, 20] を返しました。
def is_iterable(x):
try:
iter(x)
return True
except TypeError:
return False
100万回ずつ呼んだ1回あたりの時間です(5回測った最小値)。
差は1回あたり数百ナノ秒で、速さより判定の正しさで選びます。外から来た値を受け取る関数の入口なら try iter()、型ヒントと合わせて読みやすく書くなら isinstance が向きます。
「1個でもリストでも受け取る」関数の落とし穴
「回せなければリストで包む」関数を書くと、文字列が1文字ずつに分かれます。文字列は iterable だからです。
from collections.abc import Iterable
def to_list(x):
if isinstance(x, (str, bytes)) or not isinstance(x, Iterable):
return [x]
return list(x)
文字列を除かない版では、手元で "abc" が ['a', 'b', 'c'] になりました。上の版では 5 → [5]、"abc" → ['abc']、[1, 2] → [1, 2] です。ただし、どんな値でも受け取る関数は原因を隠しやすく、呼び出し元の誤りに気づく機会が減ります。まず呼び出し元で正しい型を渡せないかを考えます。
実行前に mypy で見つける
型ヒントを書いて型チェッカーの mypy を通すと、実行する前に見つかります。手元の mypy 2.4.1 で、原因2・12・9 を1つのファイルにまとめて調べた出力です。
def count_occurrence(values: list[int], to_find: int) -> int:
n = 0
for i in len(values):
if values[i] == to_find:
n += 1
return n
def load_users() -> None:
users = ["tanaka", "suzuki"]
print(len(users), "users")
for u in load_users():
print(u)
a, b = 10
typed.py:3: error: "int" has no attribute "__iter__"; maybe "__int__"? (not iterable) [attr-defined]
typed.py:12: error: "load_users" does not return a value (it only ever returns None) [func-returns-value]
typed.py:12: error: "None" has no attribute "__iter__" (not iterable) [attr-defined]
typed.py:15: error: "int" object is not iterable [misc]
Found 4 errors in 1 file (checked 1 source file)
型ヒントの無い関数は調べられませんでした。 原因12のコードを型ヒント無しで mypy に通すと Success: no issues found で、--check-untyped-defs を付けても同じでした。戻り値の型(-> None や -> list[str])を書いて初めて、呼び出し側の誤りが見つかります。型ヒントの書き方は関連記事「Pythonの型ヒントの書き方|3.12以降の新しい書き方まで」で扱っています。
似たエラーとの違いと環境別の見え方(3.11〜3.14・Jupyter)
この節では、not iterable に似た文言の見分け方、Python 3.14 で変わった文言、環境ごとの表示の違いが分かります。
文言の前半で、どの操作で起きたかが分かります。 手元で1つずつ出した原文です。
| 出したコード | エラー原文(3.13) | どの操作か |
|---|---|---|
for i in 5 | 'int' object is not iterable | for・sum・list など |
a, b = 10 | cannot unpack non-iterable int object | アンパック |
"apple" in 5 | argument of type 'int' is not iterable | in 演算子 |
f(*3) | __main__.f() argument after * must be an iterable, not int | * での引数展開 |
yield from 5 | 'int' object is not iterable | ジェネレーター |
next([1, 2]) | 'list' object is not an iterator | next の直接呼び出し |
np.array(5) を for | iteration over a 0-d array | NumPy の0次元配列 |
len(None) | object of type 'NoneType' has no len() | len |
",".join([1, 2]) | sequence item 0: expected str instance, int found | 中身の型が違う |
最後の join は、リスト自体は回せるが中の要素が文字列でないという別の問題です。",".join(map(str, [1, 2])) と書きます。
Python 3.14 で in 演算子の文言が変わった
NumPy・pandas を使わない35本を Python 3.13.18 と 3.14.6 で実行して最後の行を比べると、違ったのは in 演算子の2本だけでした。
3.13: TypeError: argument of type 'int' is not iterable
3.14: TypeError: argument of type 'int' is not a container or iterable
3.13: TypeError: argument of type 'NoneType' is not iterable
3.14: TypeError: argument of type 'NoneType' is not a container or iterable
3.14 では「container(in で中を調べられるもの)でも iterable でもない」と、in が使える条件を両方挙げる文言になっています。手元で確かめた範囲では、Python 3.14 の「What's New」の改善されたエラーメッセージの項に、この変更は載っていませんでした。エラー文で検索するときは、3.14 なら「not a container or iterable」、3.13 以前なら「is not iterable」 で探すと、同じ原因の情報に当たります。直し方は同じで、stock = {"apple": 5} のように辞書やリストにしてから in を使うと、手元では True が返りました。
環境別の見え方(Python 3.10以前・3.11〜3.14・Jupyter)
このエラーの文言と原因は、Windows・Mac・Linux で同じです。 違うのは表示の形で、Python の版と、ターミナル・Jupyter のどちらで動かすかで変わります。版はターミナルで python3 --version(Windows の公式インストーラーで入れた場合は py --version)と打つと分かります。手元の 3.11.18・3.12.3・3.13.18・3.14.6 では、in 演算子以外の最後の行の文言は同じでした。
| 環境 | 表示の特徴 | 見る場所 |
|---|---|---|
| Python 3.11〜3.14 のターミナル | エラーの行の下に ~ と ^ | ^ の下の値 |
| Python 3.10 以前のターミナル | 行だけで印が無い(-X no_debug_ranges で再現) | print で type と値を見る |
| Jupyter・IPython | ----> の矢印が行を指し、Cell In[番号] と出る | 矢印の行と前後の行 |
| VS Code のデバッグ実行 | 例外で止まり、変数の値を画面で見られる(公式ドキュメントの範囲) | 変数の一覧で型と値 |
| NumPy・pandas の中 | 型名が numpy.int64 など | 自分のファイル名の行 |
IPython 9.18.1 で原因1のコードを実行したときの表示です。Jupyter Notebook も同じ IPython が表示を作ります。
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Cell In[1], line 2
1 count = 14
----> 2 for i in count:
3 print(i)
TypeError: 'int' object is not iterable
Jupyter では、前のセルで count = len(data) のように同じ名前に整数を入れ直したまま、別のセルで for x in count を実行して止まることがあります。「さっきまで動いていた」なら、カーネルを再起動して上から順に実行し直すと、どのセルで値が変わったかが分かります。
よくあるエラー/つまずき
この節では、not iterable の周辺でつまずきやすい点を、症状・原因・直し方の表で確かめられます。
| 症状(原文) | 原因 | 直し方 |
|---|---|---|
| for の行で 'int' object is not iterable | range の書き忘れ・len() をそのまま | range(n)・for x in a |
| sum・max の行で 'int' object is not iterable | 呼び出し元が1個の数を渡した | 1つ上の行の引数を見る |
| 'NoneType' object is not iterable | return の書き忘れ・sort() の戻り値 | return を書く・sorted() |
| cannot unpack non-iterable int object | 辞書を items() なしで回した・1個だけ返した | .items()・return a, b |
| cannot unpack non-iterable NoneType object | 見つからないとき None を返す関数 | is not None で先に判定 |
| 'function' object is not iterable | 関数の () を付け忘れた | get_users() |
| 'numpy.int64' object is not iterable | 集計結果(1個の数)を回した | 集計前の列を回す |
| エラーは出ないが2回目のループが空 | ジェネレーターを使い切った | list() で保存する |
| エラーは出ないが1文字ずつ処理された | 文字列を回した(input() の結果など) | int() で変換・リストで包む |
境界の値で試す
このエラーは、「普段はリストなのに、1件のときだけ数」「0件のときだけ None」のように、データの件数が境界にあるときに出がちです。関数の入口で型を確かめ、0件・1件・複数件の3通りを試すと、本番のデータを流す前に見つかります。
- 1回数として使う数に range を付けたかfor・enumerate・list に回数を渡すときは range(n)
- 2関数のすべての分岐で同じ型を返しているかreturn の書き忘れ・見つからないときの None・再帰の整数
- 3その場で変更するメソッドの戻り値を代入していないかsort・append・extend・reverse は None を返す
- 4外から来たデータの型を確かめたかJSON・API・pandas の集計は、件数と一覧・1個の数と列を区別する
- 5型ヒントを書いて mypy を通したか戻り値の型を書いた関数なら、実行前に見つかる
判断表:not iterableの直し方の選び方
この節では、場面ごとにどの直し方を選ぶかが一覧で分かります。
| 場面 | 選ぶ直し方 | 選ばない方がよいもの |
|---|---|---|
| n 回くり返す | for i in range(n) | for i in n |
| リストの全要素を処理する | for x in a・enumerate(a) | range(len(a)) で番号を計算 |
| 1個の値を sum・list の関数に渡す | [x] で包んで渡す | 関数側で何でも受け取る |
| 辞書のキーと値を回す | for k, v in d.items() | for k, v in d |
| 並べ替えた結果を使う | sorted(a) | a = a.sort() |
| 見つからないことがある関数 | None を返し、受け取る側で is not None | そのままアンパック |
| 整数の各桁を扱う | str(n) にして回す | 整数のまま回す |
| 回せるかを判定する | try: iter(x) | hasattr(x, "__iter__") |
| 実行前に見つけたい | 戻り値の型ヒント+mypy | 型ヒント無しで mypy だけ通す |
- 1最後の行の型名を見るint・NoneType・float・function・numpy.int64・自作クラス名
- 2自分のファイルの行と ^ の印を見る印の下が取り出せなかった値。関数の中なら1つ上の呼び出し元も
- 3回数か、集まりかを決める回数なら range、集まりのはずなら値の出どころを調べる
- 4型ヒントを書いて再発を防ぐ戻り値の型を書くと、mypy が呼び出し側の誤りを指摘する
大事なのは、エラーを消すことより「なぜそこに整数(や None)が入ったのか」を説明できるようにすることです。回数なら range を付け、集まりのはずなら値を作った場所を直します。
よくある質問
この節では、'int' object is not iterable について検索されることの多い疑問に答えます。
Q. 'int' object is not iterable の日本語の意味は?
A. 「int(整数)のオブジェクトは反復可能ではありません」、つまり「整数は1個ずつ取り出せない」という意味です。for文や sum・list に整数を渡したときに出ます。
Q. iterable とは何ですか?
A. 要素を1個ずつ順に取り出せるもののことです。リスト・タプル・文字列・辞書・集合・range・ファイルなどが当てはまり、整数・小数・True/False・None は当てはまりません。
Q. for文で数字の回数だけくり返すには?
A. for i in range(n): と書きます。range(5) は 0〜4 を1個ずつ返します。1から始めたいときは range(1, n + 1) です。
Q. 'NoneType' object is not iterable は何が違う?
A. 回そうとした値が None だったという意味です。return を書き忘れた関数や、a = a.sort() のように None を返すメソッドの結果を回したときに出ます。
Q. cannot unpack non-iterable int object の意味は?
A. 1個の整数を a, b = ... で複数の変数に分けようとした、という意味です。辞書を .items() なしで2つの変数で回したときにもよく出ます。
Q. iterable と iterator の違いは?
A. iterable は回せるもの、iterator は回している途中の位置を覚えている係です。iterator は1回使い切ると空になり、2回目はエラーにならずに何も返しません。
Q. 値が iterable かどうかを判定するには?
A. 公式ドキュメントは iter(x) を呼んで TypeError になるかで判定する方法を、確実な唯一の方法としています。isinstance(x, Iterable) は __getitem__ だけで回せるクラスを見落とします。
Q. 整数の各桁を for で回したいときは?
A. str(n) で文字列にしてから回し、1文字ずつ int() に戻します。2026 の各桁の和は sum(map(int, str(2026))) で 10 でした。
Q. Python 3.14 でエラー文が違うのはなぜ?
A. in 演算子の文言が「argument of type 'int' is not a container or iterable」に変わっています。手元の 3.13.18 と 3.14.6 で比べると、比べた35本中この2本だけが違いました。for文などの 'int' object is not iterable は同じです。
Q. try-except で囲めば解決?
A. 外から来るデータの型が決まっていない入口では有効です。ただ、関数の戻り値の書き忘れのようなバグを隠すと、別の場所で結果がおかしくなります。まず整数や None が入った理由を直します。
まとめ
この節では、記事の要点を5つに絞って振り返ります。
- 意味:整数(など1個の値)を、1個ずつ取り出す操作(for・sum・list・アンパック・in)に渡した。
- 特定:最後の行の型名と、自分のファイルの行の
^の印を見る。関数の中なら呼び出し元の引数を確かめる。 - 原因:「回数のつもりの数を回した」(range の書き忘れ・len())か、「集まりのつもりが数・None だった」(戻り値・sort()・JSON・集計結果・再帰)の2系統。
- 直し方:回数なら
range(n)、1個なら[x]、辞書は.items()、並べ替えはsorted()、関数はすべての分岐で同じ型を返す。 - 予防:戻り値の型ヒントを書いて mypy を通す。判定が要るなら
iter(x)を try で呼ぶ。
参考・出典
この節では、この記事で確かめた公式の資料が分かります(確認日 2026年11月5日)。
- Python 公式ドキュメント「Glossary」iterable・iterator:https://docs.python.org/3/glossary.html
- Python 公式ドキュメント「Built-in Functions」iter・next・range:https://docs.python.org/3/library/functions.html
- Python 公式ドキュメント「collections.abc」Iterable:https://docs.python.org/3/library/collections.abc.html
- Python 公式ドキュメント「Built-in Exceptions」TypeError・StopIteration:https://docs.python.org/3/library/exceptions.html
- Python 公式ドキュメント「What's New In Python 3.14」:https://docs.python.org/3/whatsnew/3.14.html
- mypy 公式ドキュメント:https://mypy.readthedocs.io/
- NumPy 公式ドキュメント「numpy.atleast_1d」:https://numpy.org/doc/stable/reference/generated/numpy.atleast_1d.html
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「'int' object is not iterableの原因と直し方|再現20例」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。