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