چالش روزانه · ۱۸ آبان ۱۴۰۵

چالش پایتون ۲۲: حذف حین پیمایش

قبل از اجرای کد، خروجی آن را پیش‌بینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه می‌کند.

nums = [2, 4, 6, 7]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)
print(nums)
خروجی این کد چیست؟

نمایش پاسخ و توضیح

پاسخ درست: گزینهٔ الف — [4, 7]

گام به گام

حلقهٔ for با یک شمارندهٔ داخلی روی اندیس‌ها جلو می‌رود. وقتی وسط کار عنصری حذف شود، بقیه یک خانه عقب می‌آیند و حلقه از روی یکی می‌پرد.

اندیس 0: [2, 4, 6, 7]  → n=2 زوج، حذف → [4, 6, 7]
اندیس 1: [4, 6, 7]     → n=6 زوج، حذف → [4, 7]     (4 جا ماند!)
اندیس 2: [4, 7]        → وجود ندارد، حلقه تمام

جواب: [4, 7]. خطایی هم رخ نمی‌دهد، و همین آن را خطرناک می‌کند: یک خطای منطقی بی‌صدا.

راه درست

روی یک کپی پیمایش کنید، یا یک لیست تازه بسازید:

nums = [2, 4, 6, 7]
for n in nums[:]:
    if n % 2 == 0:
        nums.remove(n)
print(nums)   # [7]

nums = [2, 4, 6, 7]
odd = []
for n in nums:
    if n % 2 != 0:
        odd.append(n)
print(odd)    # [7]

(درس متدهای لیست: جهش حین پیمایش)

حالا خودت اجرا کن و تغییرش بده

nums = [2, 4, 6, 7]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)
print(nums)