ویدیو توضیح انواع copy(Shallow, Deep) در پایتون

امیرحسین بیگدلو June 2023

در این بخش به تفاوت بین shallow copy و deep copy در پایتون میپردازیم. shallow copy یعنی کپی سطحی و deep copy یعنی کپی عمیق.

 

نکته ای که همین اول کار باید بدونید اینکه این بحث فقط در مورد آبجکت های mutable مثل list, dict, set وجود داره و آبجکت هایی که immutable هستند مثل tuple ها این بحث درموردشون وجود نداره.

 

زمانی که شما سعی در کپی گرفتن از یک آبجکت mutable رو دارید اون چیزی که شما انتظار دارید با چیزی که پایتون قراره انجام بده متفاوت هستش. به مثال زیر دقت کنید:

a = [1, 2, 3, 4]

b = a

 

من در خط اول یک لیست دارم. برای کپی گرفتن از این لیست ساده ترین روشی که به ذهنمون میرسه اینکه اون لیست به یک متغیر دیگه منسوب کنیم، دقیقا مثل خط دوم. اما اینکار یک کپی از لیست نمیگیره و فقط یک اشاره گر جدید به اون لیست ایجاد میکنه.

 

اگر هم بخواید مطمئن بشید میتونید id های متغیرها رو چاپ کنید:

print( id(a) )
print( id(b) )

 

کد بالا رو که اجرا کنید میبینید که یک عدد رو نشون میده. به این میگیم shallow copy در پایتون. حالا من سعی میکنیم که لیست b رو تغییر بدم:

a = [1, 2, 3, 4]
b = a

b[0] = 11

print(a)
print(b)

 

در کد بالا من لیست b رو تغییر دادم اما لیست a هم تغییر خواهد کرد. چرا؟ چون b فقط یک اشاره گر بود به لیست a:

[11, 2, 3, 4]
[11, 2, 3, 4]

 

برای حل این مشکل ما سه تا متد داریم: list(), dict(), set()

b = list(a)

b[0] = 11

 

این سه تا متد deep copy میگیرن. حالا اگه لیست b رو تغییر بدین میبینید که لیست a تغییری نکرده.

[1, 2, 3, 4] #a
[11, 2, 3, 4] #b

 

اما این سه تا متد در زمانی که شما آبجکت های تو در تو دارید به درستی کار نخواهند کرد.

a = [1, 2, 3, 4, [5, 6]]
b = list(a)

b[4][0] = 55

print(a)  # [1, 2, 3, 4, [55, 6]]
print(b)  # [1, 2, 3, 4, [55, 6]]

 

همونطور که میبینید زمانی که لیست هامون تو در تو هستند باز هم هردو لیست تغییر میکنن. برای حل کامل مشکل میتونید از ماژول copy استفاده کنید:

import copy

a = [1, 2, 3, 4]
b = copy.copy(a)      # shallow copy
c = copy.deepcopy(a)  # deep copy

در این ماژول دوتا متد داریم که برامون هم shallow copy و هم deep copy میگیرن.

 

اگر ویدیو بالا را دوست داشتید پیشنهاد میکنیم به مطالب زیر هم سر بزنید:

آموزش ماژول platform در پایتون

آموزش ماژول shutil در پایتون

ارزیابی class variableهای پایتون

مشکل سازگاری importها در پایتون

ویدیوهای مشابه



ارسال نظر


mohammad

2 سال قبل پاسخ به نظر

عالی بود مرسی

ارسال نظر



هاله

2 سال قبل پاسخ به نظر

عالی بود مرسی واقعا. برا کد نویسی تزم یه هفتس لنگه همین موردبودم که خداروشکر با توضیحات عالی تون حل شد.

ارسال نظر



nasrin

2 سال قبل پاسخ به نظر

سلام عالي بود توضيحاتتون كامل و دقيق بود
ممنون از مطالب مفيد تون.

ارسال نظر



ehsan

3 سال قبل پاسخ به نظر

با سلام خدمت استاد عزیز بسیار ممنون از توضیحات خوب شما

ارسال نظر



باب

3 سال قبل پاسخ به نظر

عالی <3 <3

ارسال نظر



farid

3 سال قبل پاسخ به نظر

خسته نباشی یه پشنهاد داشتم کاشکی داخل یکسری ویدیو سوالات برنامه نویسی مثل هکررنک رو حل کنی باسطوح مختلف که قطغا نکاتی زیادی میتونه برای دوستانی که از سطح مقدماتی بیشتر هستن داشته باشه مثل دوره الگوریتم که عالی هستش

ارسال نظر



امیرحسین بیگدلو

3 سال قبل

سلام
پیشنهاد خوبیه
حتما در نظر میگیرمش

milad

3 سال قبل پاسخ به نظر

درود بر تو
همینطور ادامه بده.

ارسال نظر



مونگارد