Akram.k
Akram.k
خواندن ۲ دقیقه·۱ سال پیش

آشنایی با مفاهیم ,shallow copy ,deep copy ،mutable،immutable در پایتون

اimmutable به متغیری گفته میشود که بعداز تعریف امکان تغییر و اصطلاحا" assign کردن مقدار جدید به آن وجود ندارد و string,float,string,boolean... از دیتا تایپ immutable هستند
اگر ما یک مقدار a=12 در حافظه داشته باشیم همزمان نمی‌شود به a دو مقدار  12و13 داد ولی میشود 13 را به assign, a کرد.در این حالت دیگر a به 12 اشاره نمیکند ولی حذف نمیشود چون b هم به 12 داره اشاره میکنه (اگر ما یک مقدار12 تو حافظه داشته باشیم و هر متغیری که 12 بهش assign  شده داره به همان 12 اشاره میکنه (و ما هیچ وقت 2 تا 12 تو پایتون  و memory نخواهیم داشت)
اگر ما 14 به assign..b کنیم مقدار 12 تو حافظه هست و بعد از مدتی نه همان موقع garbage  collector دنبال value های میگرده که کسی بهش reference نداره و از توحافظه پاک میکنه ولی ما نمی‌بینیم این کارکرد خود سیستم است .حتی اگر من اینجا 12 رو بریزم داخل a وبعد (a+=1 )کنم دوباره  assign  میشه به خود a ولی تغییری ایجاد نمیشه چون دسترسی بهش نداریم و در جای دیگر از حافظه مقدار 13 ایجاد میشه و دیگه به 12 قدیم اشاره نداره وبه 13 اشاره میکنه ....گاربج کالکتور( GC) حافظه رو خالی میکنه. ..وهردفعه که مقدار رو assign  میکنیم خودش کپی میگیره،مثال:

نتیجه:

اmutable به متغیری گفته میشود که بعداز تعریف امکان تغییر و اصطلاحا" assign کردن مقدار جدید به آن وجود دارد و لیست ،دیکشنری،سِت از دیتا تایپ mutable هستند
در حافظه دو متغیر a,b وجود دارد که به یک لیست اشاره میکنند و وقتی مقداری را append می‌شود تغییرات قابل مشاهده هست در لیست .در mutable ها اگر مقدار جدیدی بخواهیم به لیست اضافه کنیم
بخاطر random access memory بودن آنها امکان دارد هرجای از حافظه قرار بگیرند که بتوانند به انتهای لیست اضافه شوند.پس نیاز هست هر دفعه کل لیست کپی شود.برای حل این مشکل از قبل یک مقدارخونه های که خالی هستند را رزرو میکنیم.

نتیجه:


هShallow copy:


در کپی سطحی، یک متغیر ساخته می‌شود و به مکانی در حافظه، که مقدار متغیر قبلی در آن قرار گرفته است، اشاره می‌کند. پس اگر مقدار متغیر اول را تغییر دهیم، متغیر دوم هم تغییر می‌کند. و همین‌طور اگر مقدار متغیر دوم را تغییر دهیم، مقدار متغیر اول هم تغییر می‌کند.

نتیجه :

هDeep copy:

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


نتیجه:





حافظهdeep copyshallow copy
شاید از این پست‌ها خوشتان بیاید