از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
کپی های عمیق در مقابل کم عمق در پایتون
سرفصلهای مطلب
معرفی
در این آموزش قصد داریم با استفاده از مثال هایی در پایتون به بحث کپی های کم عمق در مقابل کپی های عمیق بپردازیم. ما تعریف یک کپی عمیق و کم عمق را به همراه پیاده سازی آن در زبان پایتون برای ارزیابی تفاوت های اصلی بین دو نوع کپی پوشش خواهیم داد.
در بسیاری از برنامههایی که مینویسیم، مهم نیست که چقدر ابتدایی هستند، به یکی از دلایل متعدد، مانند کارایی محاسباتی، نیاز به کپی کردن یک لیست یا یک شی داریم. دو راه برای انجام این کار وجود دارد، یا یک کپی عمیق یا یک کپی کم عمق ایجاد کنید. قبل از اینکه درباره تفاوتهای این دو بحث کنیم، اجازه دهید ابتدا بفهمیم کپیهای عمیق و کم عمق دقیقاً چیست.
کپی های عمیق در پایتون
یک کپی عمیق یک کپی جدید و جداگانه از یک می سازد کل شی یا لیست با آدرس حافظه منحصر به فرد خود. این بدان معنی است که هر تغییری که در کپی جدید شی/لیست ایجاد می کنید در نسخه اصلی منعکس نمی شود. این process ابتدا یک لیست یا شی جدید ایجاد می شود و سپس به صورت بازگشتی عناصر را از اصلی به جدید کپی می کند.
به طور خلاصه، هر دو شی کاملاً مستقل از یکدیگر هستند. این شبیه به مفهوم عبور از ارزش در زبان هایی مانند C++، جاوا و C# است.
نمونه کپی عمیق
برای پیاده سازی مفهوم کپی های عمیق در پایتون، ما از آن استفاده خواهیم کرد کپی 🀄 مدول.
فرض کنید لیستی از لیست ها به نام داریم result_A
، که شامل نمرات دانش آموز A در 3 درس برای دو سال اول مدرسه است و ما می خواهیم یک لیست دقیقا مشابه از نتایج برای دانش آموز B نیز ایجاد کنیم. ما سعی خواهیم کرد یک کپی عمیق از آن ایجاد کنیم result_A
فهرست کنید و بعداً چند تغییر در آن کپی عمیق ایجاد کنید تا نمرات دانش آموز B را نشان دهید.
مثال 1:
import copy
result_A = ((90, 85, 82), (72, 88, 90))
result_B = copy.deepcopy(result_A)
print(result_A)
print(result_B)
در اسکریپت بالا از deepcopy
روش از copy
ماژول برای کپی لیست result_A
به result_B
. بعد، ما print محتویات هر دو لیست روی صفحه نمایش
خروجی:
((90, 85, 82), (72, 88, 90))
((90, 85, 82), (72, 88, 90))
همانطور که می بینید، لیست ها یکسان هستند. بعد روی در این مقاله خواهیم دید که چگونه این با کپی های کم عمق متفاوت است.
کپی های کم عمق در پایتون
یک کپی کم عمق نیز یک شی یا لیست شی جدید جداگانه ایجاد می کند، اما به جای کپی کردن عناصر فرزند در شی جدید، به سادگی مراجع را به آدرس های حافظه آنها کپی می کند. بنابراین، اگر تغییری در شی اصلی ایجاد کنید، در شیء کپی شده منعکس می شود و بالعکس. به طور خلاصه، هر دو نسخه وابسته هستند روی یکدیگر. این شبیه به مفهوم عبور از طریق مرجع در زبان های برنامه نویسی مانند C++، C# و جاوا است.
مثال کپی کم عمق
برای پیاده سازی این در پایتون، از copy
ماژول دوباره، اما این بار ما آن را فراخوانی خواهیم کرد copy
تابع.
بیایید از همان لیست مثال برای مثال کپی کم عمق نیز استفاده کنیم.
مثال 2:
import copy
result_A = ((90, 85, 82), (72, 88, 90))
result_B = copy.copy(result_A)
print(result_A)
print(result_B)
در اسکریپت بالا از copy
روش از copy
ماژول برای ایجاد یک کپی کم عمق از لیست result_A
که نام بردیم result_B
. در ادامه، محتویات هر دو لیست چاپ شده است روی را console.
خروجی:
((90, 85, 82), (72, 88, 90))
((90, 85, 82), (72, 88, 90))
باز هم، لیست ها همان است که انتظار می رود. در ادامه تفاوت بین نتایجی که از آن به دست می آوریم را توضیح خواهیم داد copy
و deepcopy
کارکرد.
تفاوت بین کپی های عمیق و کم عمق
اکنون که در مورد اینکه کپیهای سطحی و عمیق چیست و چرا کپیها را ایجاد میکنیم بحث کردیم، وقت آن است که در مورد تفاوت بین آنها صحبت کنیم. اساسا، فقط دو تفاوت اصلی وجود دارد و آنها با یکدیگر مرتبط هستند:
- کپی عمیق کپی های یک شی را ذخیره می کند ارزش های، در حالی که داستان های کپی کم عمق منابع به آدرس حافظه اصلی
- کپی عمیق تغییرات ایجاد شده در شیء جدید/کپی شده در شی اصلی را منعکس نمی کند. در حالی که، کپی کم عمق انجام می دهد
قبل از اینکه حرکت کنیم روی برای اجرا، من می خواهم شما این سناریو را تصور کنید. فرض کنید دو نفر مایلند نوشیدنی مشترکی داشته باشند. آنها دو لیوان خالی و دو نی دارند. آنها می توانند این نوشیدنی را به دو طریق به اشتراک بگذارند:
- نوشیدنی را در یک لیوان بریزید و هر دو نی را برای تقسیم در آن لیوان قرار دهید
- نوشیدنی را در هر دو لیوان بریزید و در هر لیوان یک نی بریزید
سناریوی اول یک کپی کم عمق است. هر دو متغیر/نمونه در حال اشاره/استفاده از یک مکان حافظه برای عملیات خود هستند. سناریوی دوم یک کپی عمیق است. هر دو متغیر/نمونه به دو مکان حافظه متفاوت برای عملیات خود اشاره می کنند/استفاده می کنند.
مثال مقایسه
برای روشن شدن تفاوت، اجازه دهید از این اطلاعات در دو مثال بالا استفاده کنیم مثال 1.
در بالا، ما لیست را ایجاد کردیم result_A
و یک کپی عمیق از آن به نام result_B
. بیایید سعی کنیم محتوا را تغییر دهیم result_B
و ببینید تاثیری داره یا نه روی محتویات result_A
.
import copy
result_A = ((90, 85, 82), (72, 88, 90))
result_B = copy.deepcopy(result_A)
result_B(0)(0) = 30
print("Original List: ")
print(result_A)
print("Deep Copy:")
print(result_B)
خروجی:
Original List:
((90, 85, 82), (72, 88, 90))
Deep Copy:
((30, 85, 82), (72, 88, 90))
نتیجه مورد انتظار این است که لیست اصلی بدون تغییر باقی می ماند. و همانطور که می بینید، تغییرات در کپی عمیق بر لیست اصلی تاثیری نداشت.
حالا بیایید همین کار را با هم امتحان کنیم مثال 2 – کپی کم عمق
import copy
result_A = ((90, 85, 82), (72, 88, 90))
result_B = copy.copy(result_A)
result_B(0)(0) = 30
print("Original List: ")
print(result_A)
print("Shallow Copy:")
print(result_B)
خروجی:
Original List:
((30, 85, 82), (72, 88, 90))
Shallow Copy:
((30, 85, 82), (72, 88, 90))
در اینجا نتیجه مورد انتظار این است که هم لیست اصلی و هم لیست کپی شده پس از تغییر واحد اصلاح می شوند. و همانطور که می بینید، ایجاد تغییر در کپی کم عمق باعث شد که این تغییر در لیست اصلی نیز منعکس شود.
نتیجه
در این پست، ما در مورد اینکه یک کپی کم عمق و عمیق چیست و چگونه می توانیم آنها را با استفاده از ماژول ‘کپی’ به زبان پایتون بسازیم، صحبت کردیم. ما از دو تابع آن استفاده کردیم copy
و deepcopy
به ترتیب کپی های کم عمق و عمیق تهیه کنید. علاوه بر این، ما دو تفاوت اصلی بین یک کپی کم عمق و یک کپی عمیق را مورد بحث قرار دادیم و همچنین کپی کم عمق و عمیق را در python برای درک بهتر این تفاوت ها
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-23 12:33:06