دانیال بیدکانی بختیاروند
دانیال بیدکانی بختیاروند
خواندن ۱ دقیقه·۶ سال پیش

فرق کپی سطحی و کپی عمیق (Deep copy vs shallow copy)

در زبان‌های برنامه‌نویسی هنگامی که نیاز باشد از یک متغیر کپی گرفته شود، معمولا دو راه معرفی می‌شود.

یک) استفاده از کپی سطحی یا 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)
پایتونdeep copyshallow copy
مهندس نرم‌افزار، مهندس داده، علاقه‌مند به هوش مصنوعی (دانش‌آموخته‌ی دانشگاه خواجه نَصیرُالدین طوسی)
شاید از این پست‌ها خوشتان بیاید