آموزش برنامه نویسی پایتون (Python)

تفاوت بین مساوی قرار دادن (با علامت =)، کپی سطحی (shallow copy) و کپی عمیق (deep copy)، برای دیکشنری ها (dictionary)، در پایتون (Python)

هنگامی که بخواهیم یک کپی از یک دیکشنری (dictionary) داشته باشیم، به سه صورت می توانیم عمل کنیم. با مساوی قرار دادن (علامت =)، با کپی سطحی (shallow copy) (روش copy) و با کپی عمیق (deep copy) (روش copy.deepcopy). اما در این مبحث قصد داریم که تفاوت بین این سه را بیان کنیم.

1- مساوی قرار دادن (با علامت =) :

برای ساخت یک دیکشنری با نام b که برابر دیکشنری a باشد، عبارت زیر را می نویسیم (در ادامه شرح خواهیم داد که در واقع ساخت یک دیکشنری جدید صورت نمی گیرد) :

در این روش، a و b هر دو به یک شیء (object) اشاره می کنند. بنابراین با تغییر محتوای یکی، دیگری نیز تغییر خواهد کرد (مستقل نیستند).

2- کپی سطحی (shallow copy) (روش copy) :

برای ساخت یک دیکشنری با نام b که برابر دیکشنری a باشد، عبارت زیر را می نویسیم :

با این روش، b یک کپی سطحی (shallow copy) از a می باشد، به این معنی که اگرچه a و b دو شیء جداگانه (isolated objects) هستند، اما محتوای آنها یکی است (محتوا کپی نشده است) و با تغییر محتوای یکی، محتوای دیگری نیز تغییر می کند(محتوای آنها مستقل نیست).

3- کپی عمیق (deep copy) (روش copy.deepcopy) :

برای ساخت یک دیکشنری با نام b که برابر دیکشنری a باشد، عبارت زیر را می نویسیم :

a و b هم دو شیء جداگانه (isolated objects) بوده و هم اینکه محتوای آنها مستقل خواهد بود، یعنی تغییر در محتوای یکی، باعث تغییر در محتوای دیگری نخواهد شد.

بنابراین اگر بخواهیم که یک کپی از یک دیکشنری (dictionary) داشته باشیم که کاملا جداگانه بوده و تغییرات مورد نظرمان صرفا بر روی آن اجرا گردد (نه آن دیکشنری که از روی آن کپی کرده ایم)، باید کپی عمیق (deep copy) (روش copy.deepcopy) را به کار ببریم.

به مثال زیر توجه کنید :

مثال

در این مثال، با سه بار کدنویسی، هر سه روش ذکر شده را برای ساخت یک دیکشنری با نام b به صورت کپی (یا تساوی) از روی دیکشنری a ، به کار می بریم. سپس یک عنصر به دیکشنری a اضافه می کنیم (تغییر دیکشنری a) و بررسی می کنیم که آیا با تغییر دیکشنری a ، دیکشنری b نیز تغییر می کند یا خیر.

1- مساوی قرار دادن (با علامت =) :

نتیجه :

مشاهده می کنید که چون a و b هر دو به یک شیء (object) اشاره می کنند، با تغییر محتوای a ، محتوای b نیز تغییر کرده است (در واقع، تغییر محتوای آن شیء (object) واحد).

2- کپی سطحی (shallow copy) (روش copy) :

نتیجه :

مشاهده می کنید که با تغییر محتوای a ، محتوای b نیز به همان صورت تغییر کرده است

3- کپی عمیق (deep copy) (روش copy.deepcopy) :

نتیجه :

چون a و b کاملا جداگانه و مستقل هستند، با تغییر در محتوای a ، هیچگونه تغییری در b ایجاد نخواهد شد.

نویسنده علیرضا گلمکانی
شماره کلید 20638
گزینه ها
به اشتراک گذاری (Share) در شبکه های اجتماعی
نظرات 0 0 0

ارسال نظر جدید (بدون نیاز به عضو بودن در وب سایت)