چالش روزانه · ۱۸ آبان ۱۴۰۵
چالش پایتون ۲۲: حذف حین پیمایش
قبل از اجرای کد، خروجی آن را پیشبینی کن. حدس نزن؛ خط به خط فکر کن پایتون چه میکند.
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)