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

چالش پایتون ۲۱: کپی سطحی لیست تودرتو

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

a = [[1, 2], [3]]
b = a[:]
b[0].append(9)
b[1] = [0]
print(a)
خروجی این کد چیست؟

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

پاسخ درست: گزینهٔ ج — [[1, 2, 9], [3]]

گام به گام

a[:] یک کپی سطحی (shallow copy) است: لیست بیرونی جدید ساخته می‌شود، اما عنصرهایش همان لیست‌های داخلی قبلی‌اند.

a ─┐            ┌─→ [1, 2]
   ├ لیست جدا ──┤
b ─┘            └─→ [3]
  • b[0].append(9) لیست داخلی مشترک را تغییر می‌دهد، پس در a هم دیده می‌شود.
  • b[1] = [0] فقط خانهٔ ۱ از لیست بیرونی b را به لیست تازه‌ای وصل می‌کند. لیست بیرونی a جداست و دست نمی‌خورد.

جواب: [[1, 2, 9], [3]]

کپی عمیق

import copy
a = [[1, 2], [3]]
b = copy.deepcopy(a)
b[0].append(9)
print(a)   # [[1, 2], [3]]

deepcopy لیست‌های داخلی را هم کپی می‌کند. (درس متدهای لیست: لیست تودرتو)

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

a = [[1, 2], [3]]
b = a[:]
b[0].append(9)
b[1] = [0]
print(a)