در زبانهای برنامهنویسی هنگامی که نیاز باشد از یک متغیر کپی گرفته شود، معمولا دو راه معرفی میشود.
یک) استفاده از کپی سطحی یا Shallow copy
دو) استفاده از کپی عمیق یا Deep copy
اما فرق این دو در چیست؟
در کپی سطحی، یک متغیر ساخته میشود و به مکانی در حافظه، که مقدار متغیر قبلی در آن قرار گرفته است، اشاره میکند. پس اگر شما مقدار متغیر اول را تغییر دهید، متغیر دوم هم تغییر میکند. و همینطور اگر مقدار متغیر دوم را تغییر دهید، مقدار متغیر اول هم تغییر میکند.
در کپی عمیق، یک متغیر ساخته میشود و مقدار متغیر قبلی در آن کپی میشود. توجه شود که در این جا پس از کپی کردن، اگر مقدار هر کدام از متغیرها را تغییر دهیم، تغییری در مقدار متغیر دیگر مشاهده نمیکنیم.
یک مفسر پایتون باز کنید تا بهتر با این مفهوم آشنا شوید:
حالا بحث این جاست که این کارها را چگونه میتوان در پایتون انجام داد؟
در پایتون سه حالت کپی کردن وجود دارد! بله سه حالت.
حالت اول به صورت زیر است که کاملا کپی سطحی به حساب میآید:
a = [1,2,3,4] b = a id(a) id(b) b[1] = 30 print(a) print(b)
در حالت دوم ابتدا یک شی ساخته میشود و سپس به تمام اجزای موجود در لیست اشاره میکند. (توجه کنید که مقادیر کپی نمیشوند.)
import copy a = [1,2,3,4] b = [5,6] c = a+b d = copy.copy(c) id(c) id(d) c[0][1] = 12 print(c) print(d)
در حالت آخر که کپی عمیق نامیده میشود، پس از کپی دو متغیر به طور کامل از همدیگر جدا هستند و تغییر دادن یکی در دیگری اثری ندارد.
import copy a = [1,2,3,4] b = [5,6] c = a+b d = copy.deepcopy(c) id(c) id(d) c[0][1] = 12 print(c) print(d)