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

چالش پایتون ۱۶: کپی یا نام دوم؟

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

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

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

پاسخ درست: گزینهٔ الف — 4 3

گام به گام

  • b = a کپی نمی‌سازد. فقط یک نام دوم (alias) برای همان لیست است. a و b هر دو به یک شیء در حافظه اشاره می‌کنند.
  • c = a[:] با برش کامل یک لیست جدید با همان عناصر می‌سازد (کلون).

پس b.append(4) همان لیستی را عوض می‌کند که a به آن اشاره دارد، اما c دست نمی‌خورد.

a, b  →  [1, 2, 3, 4]
c     →  [1, 2, 3]

جواب: 4 3

خودتان ببینید

a = [1, 2, 3]
b = a
c = a[:]
print(a is b, a is c)   # True False
print(id(a) == id(b))   # True

برای کپی، به‌جای a[:] می‌توانید a.copy() یا list(a) هم بنویسید. (درس متدهای لیست: alias و کلون)

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

a = [1, 2, 3]
b = a
c = a[:]
b.append(4)
print(len(a), len(c))