خطأ TypeError: 'int' object is not iterable يعني أن بايثون توقعت قيمة يمكن المرور على عناصرها واحدًا واحدًا، لكنها حصلت على عدد صحيح من نوع int. إذا كان الرقم يمثل عدد مرات التكرار، فاستخدم range(). أما إذا كان المتغير يفترض أن يحتوي قائمة أو مجموعة بيانات، فأصلح مصدر البيانات بدل استخدام range() عشوائيًا.
مثال خاطئ:
for i in 5:
print(i)
النتيجة:
TypeError: 'int' object is not iterable
إذا كان المقصود «كرر العملية خمس مرات»، فالحل:
for i in range(5):
print(i)
الناتج:
0
1
2
3
4
هذا هو الدرس 30 من سلسلة مشكلة وحل على بايثون العرب.
{alertInfo} الحل ليس دائمًا range(): اسأل أولًا ماذا يمثل المتغير. هل هو عدد مرات تكرار؟ أم كان من المفترض أن يكون مجموعة عناصر؟
{getToc} $title={محتوى المقال}
ما معنى TypeError: 'int' object is not iterable؟
القيمة Iterable هي قيمة تستطيع حلقة for المرور على عناصرها واحدًا واحدًا. من الأمثلة: List وString وTuple وDictionary وrange. أما int فهو عدد مفرد وليس مجموعة عناصر.
| القيمة | هل هي قابلة للمرور عليها؟ |
|---|---|
[1, 2, 3] | نعم — List |
"Python" | نعم — String |
(1, 2, 3) | نعم — Tuple |
{"name": "Ali"} | نعم — والمرور المباشر على Dictionary يكون على المفاتيح |
5 | لا — int |
100 | لا — int |
السبب الأول: استخدام رقم مباشرة داخل for
الكود الخاطئ:
count = 5
for i in count:
print(i)
سبب المشكلة: المتغير count من نوع int، لذلك لا توجد داخله عناصر تستطيع for المرور عليها.
إذا كانت القيمة تعني عدد مرات التكرار، استخدم:
count = 5
for i in range(count):
print(i)
range(5) تعطي نطاقًا يبدأ من 0 وينتهي قبل 5.
إذا أردت العد من 1 إلى 5
count = 5
for i in range(1, count + 1):
print(i)
هنا تكون القيم: 1 و2 و3 و4 و5.
الفرق بين for item in items وfor i in range(count)
إذا كانت لديك عناصر فعلية، مر عليها مباشرة:
items = [10, 20, 30]
for item in items:
print(item)
أما إذا كنت تحتاج الفهرس تحديدًا، فيمكن استخدام:
items = [10, 20, 30]
for index in range(len(items)):
print(
index,
items[index]
)
لكن عندما تحتاج القيمة نفسها فقط، فإن for item in items أبسط وأوضح.
لا تجعل range() حلًا لكل شيء
افترض أن البرنامج يفترض وجود قائمة عناصر، لكن المتغير أصبح رقمًا بالخطأ:
items = 5
for item in items:
print(item)
إذا كانت النية الحقيقية معالجة عناصر قائمة، فالقيمة الصحيحة قد تكون مثل:
items = [
1,
2,
3,
4,
5
]
for item in items:
print(item)
هنا الحل هو إصلاح items أو مصدرها، وليس كتابة range(items). استخدام range() قد يزيل رسالة الخطأ لكنه يغير معنى البرنامج.
السبب الثاني: استخدام list() مع int
الكود الخاطئ:
numbers = list(5)
list() تتوقع Iterable يمكن أخذ عناصر منه، بينما 5 عدد مفرد.
إذا كنت تريد قائمة تحتوي الرقم 5 كعنصر واحد:
numbers = [5]
print(numbers)
أما إذا كنت تريد الأرقام من 0 إلى 4:
numbers = list(
range(5)
)
print(numbers)
الناتج: [0, 1, 2, 3, 4]. الحل يعتمد على النتيجة التي تريدها، وليس على مجرد التخلص من TypeError.
السبب الثالث: دالة تتوقع Iterable وتحصل على int
الخطأ لا يقتصر على for. مثال:
total = sum(10)
sum() تتوقع مجموعة قيم يمكن المرور عليها.
الصحيح:
numbers = [
10,
20,
30
]
total = sum(numbers)
print(total)
الناتج: 60.
السبب الرابع: المتغير تغير نوعه في مكان سابق
قد يبدأ المتغير كقائمة ثم تستبدله برقم دون أن تنتبه:
items = [
10,
20,
30
]
items = 5
for item in items:
print(item)
قبل سطر الخطأ، اطبع القيمة ونوعها:
print(items)
print(type(items))
إذا ظهر:
5
<class 'int'>
فالمشكلة بدأت قبل الحلقة. ابحث عن السطر الذي تغيرت فيه قيمة items.
حالة input(): متى يظهر الخطأ؟
input() تعيد String، وString نفسها Iterable. لذلك input() وحدها لا تسبب رسالة 'int' object is not iterable.
لكن بعد تحويل الإدخال إلى int قد يظهر الخطأ:
count = int(
input("كم مرة؟ ")
)
for i in count:
print(i)
إذا كانت القيمة تمثل عدد مرات التكرار، فالصحيح:
count = int(
input("كم مرة؟ ")
)
for i in range(count):
print(i)
يمكنك تجربة المثالين داخل محرر بايثون العرب لترى الفرق مباشرة.
كيف أعرف هل القيمة Iterable؟
ابدأ أثناء التشخيص بطباعة القيمة ونوعها:
value = 5
print(value)
print(type(value))
ويمكن في الحالات الشائعة استخدام Iterable من collections.abc:
from collections.abc import Iterable
print(
isinstance(
[1, 2],
Iterable
)
)
print(
isinstance(
"Python",
Iterable
)
)
print(
isinstance(
5,
Iterable
)
)
الناتج:
True
True
False
هذا يوضح أن List وString قابلتان للمرور عليهما، بينما int ليست كذلك.
Checklist: كيف تصلح int object is not iterable؟
- اقرأ السطر الموجود في Traceback.
- حدد المتغير الذي تحاول المرور عليه.
- اطبع قيمة المتغير.
- اطبع
type(). - اسأل: هل كان يجب أن يكون رقمًا أم مجموعة عناصر؟
- إذا كان يمثل عدد مرات التكرار، استخدم
range(). - إذا كان يجب أن يكون List أو Iterable، أصلح مصدر البيانات.
- لا تحول النوع عشوائيًا فقط لكي تختفي رسالة TypeError.
أخطاء قريبة لكنها ليست نفس الرسالة
| رسالة الخطأ | الفرق باختصار |
|---|---|
TypeError: 'int' object is not iterable | مررت int إلى مكان يحتاج Iterable. |
TypeError: object of type 'int' has no len() | استخدمت len() على int. |
TypeError: cannot unpack non-iterable int object | حاولت Unpacking لقيمة int، مثل a, b = 10. |
TypeError: list indices must be integers or slices, not str | استخدمت نصًا كفهرس List. |
IndexError: list index out of range | الفهرس رقمي لكنه خارج حدود القائمة. |
هذه رسائل مختلفة؛ لا تستخدم range() كحل تلقائي لها.
أخطاء شائعة عند محاولة الحل
- استخدام range() بدون فهم معنى المتغير: هي مناسبة لعدد مرات التكرار أو نطاق أرقام.
- تحويل int إلى String:
str(5)تصبح Iterable، لكنها تمثل النص"5"وغالبًا لا تحقق هدف البرنامج. - وضع الرقم داخل List:
[count]تعني قائمة بعنصر واحد، وليست تكرار العمليةcountمرات. - تجاهل تغير نوع المتغير: ابحث عن المكان الذي تحول فيه من List إلى int.
- استخدام try/except لإخفاء المشكلة: التقاط
TypeErrorلا يصلح سبب استخدام نوع بيانات غير مناسب.
روابط داخلية مفيدة من بايثون العرب
- سلسلة مشكلة وحل في بايثون
- شرح الحلقات Loops في بايثون للمبتدئين — لفهم
forوrange(). - شرح أنواع البيانات Data Types في بايثون — لفهم الفرق بين
intوList وString. - شرح القوائم Lists في بايثون — إذا كان المتغير يفترض أن يحتوي مجموعة عناصر.
- مشكلة وحل 28: list indices must be integers or slices, not str — خطأ مختلف متعلق بفهرسة القوائم.
- مشكلة وحل 29: unhashable type: 'list' — TypeError مختلف مرتبط باختيار نوع البيانات.
مصادر رسمية للتوسع
الخلاصة
رسالة TypeError: 'int' object is not iterable تعني أن بايثون حصلت على عدد صحيح في مكان يحتاج قيمة يمكن المرور على عناصرها.
إذا كان الرقم يعني عدد مرات التكرار، استخدم range(count). وإذا كان المتغير يفترض أن يحتوي List أو مجموعة بيانات، أصلح مصدر البيانات بدل تحويل الرقم أو استخدام range() فقط لإخفاء الخطأ.
{alertSuccess}
القاعدة المهمة: قبل اختيار الحل، اسأل: هل لدي «عدد مرات» أم «مجموعة عناصر»؟ هذه الإجابة تحدد هل تحتاج range() أم تحتاج إصلاح البيانات نفسها.
أسئلة شائعة
ماذا يعني TypeError: 'int' object is not iterable؟
يعني أنك استخدمت قيمة من نوع int في موضع يحتاج Iterable مثل List أو String أو Tuple أو range.
كيف أصلح int object is not iterable؟
افحص نوع المتغير أولًا. إذا كان الرقم يمثل عدد مرات التكرار فاستخدم range()، وإذا كان يجب أن يحتوي عناصر فصحح قيمة المتغير أو مصدر البيانات.
لماذا لا تعمل for مع رقم؟
لأن العدد الصحيح قيمة مفردة وليس مجموعة عناصر يمكن للحلقة المرور عليها.
متى أستخدم range()؟
استخدمها عندما تريد نطاق أرقام أو تكرار عملية عددًا محددًا من المرات، وليس كحل تلقائي لكل خطأ Iterable.
هل int نوع Iterable في بايثون؟
لا. القيم من نوع int ليست Iterable.
لماذا list(5) لا تعمل؟
لأن list() تتوقع Iterable. إذا أردت قائمة تحتوي الرقم فاستخدم [5]، وإذا أردت الأرقام من 0 إلى 4 فاستخدم list(range(5)).

