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

سرور مجازی NVMe

کپی های عمیق در مقابل کم عمق در پایتون

0 46
زمان لازم برای مطالعه: 4 دقیقه


معرفی

در این آموزش قصد داریم با استفاده از مثال هایی در پایتون به بحث کپی های کم عمق در مقابل کپی های عمیق بپردازیم. ما تعریف یک کپی عمیق و کم عمق را به همراه پیاده سازی آن در زبان پایتون برای ارزیابی تفاوت های اصلی بین دو نوع کپی پوشش خواهیم داد.

در بسیاری از برنامه‌هایی که می‌نویسیم، مهم نیست که چقدر ابتدایی هستند، به یکی از دلایل متعدد، مانند کارایی محاسباتی، نیاز به کپی کردن یک لیست یا یک شی داریم. دو راه برای انجام این کار وجود دارد، یا یک کپی عمیق یا یک کپی کم عمق ایجاد کنید. قبل از اینکه درباره تفاوت‌های این دو بحث کنیم، اجازه دهید ابتدا بفهمیم کپی‌های عمیق و کم عمق دقیقاً چیست.

کپی های عمیق در پایتون

یک کپی عمیق یک کپی جدید و جداگانه از یک می سازد کل شی یا لیست با آدرس حافظه منحصر به فرد خود. این بدان معنی است که هر تغییری که در کپی جدید شی/لیست ایجاد می کنید در نسخه اصلی منعکس نمی شود. این 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 محتویات هر دو لیست روی صفحه نمایش

پیشنهاد می‌کنیم بخوانید:  ذخیره سازی در localStorage در React هنگام توسعه برنامه های کاربردی سبک - ممکن است بخواهیم برخی از داده ها را ذخیره کنیم. اگر پایگاه داده بیش از حد است - یک جایگزین عالی وجود دارد: localStorage! در حالی که این یک پایگاه داده را برای اهداف پایگاه داده جایگزین نمی کند ، اما به عنوان یک سیستم ذخیره سازی ساده مبتنی بر پرونده عمل می کند که می توانید برای ذخیره داده های قابل دسترسی به راحتی از آن استفاده کنید ...

خروجی:

((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. کپی عمیق کپی های یک شی را ذخیره می کند ارزش های، در حالی که داستان های کپی کم عمق منابع به آدرس حافظه اصلی
  2. کپی عمیق تغییرات ایجاد شده در شیء جدید/کپی شده در شی اصلی را منعکس نمی کند. در حالی که، کپی کم عمق انجام می دهد

قبل از اینکه حرکت کنیم روی برای اجرا، من می خواهم شما این سناریو را تصور کنید. فرض کنید دو نفر مایلند نوشیدنی مشترکی داشته باشند. آنها دو لیوان خالی و دو نی دارند. آنها می توانند این نوشیدنی را به دو طریق به اشتراک بگذارند:

  1. نوشیدنی را در یک لیوان بریزید و هر دو نی را برای تقسیم در آن لیوان قرار دهید
  2. نوشیدنی را در هر دو لیوان بریزید و در هر لیوان یک نی بریزید
پیشنهاد می‌کنیم بخوانید:  استفاده از Mocks برای تست در جاوا اسکریپت با Sinon.jsTest "mocks" اشیایی هستند که جایگزین اشیاء واقعی می شوند در حالی که عملکرد آنها را شبیه سازی می کنند. یک mock همچنین انتظاراتی در مورد روش استفاده از توابع مورد آزمایش دارد. در برخی از موارد تست واحد ممکن است بخواهیم عملکرد جاسوس ها را ترکیب کنیم، رفتار یک روش تحت فراخوانی را مشاهده کنیم، و...

سناریوی اول یک کپی کم عمق است. هر دو متغیر/نمونه در حال اشاره/استفاده از یک مکان حافظه برای عملیات خود هستند. سناریوی دوم یک کپی عمیق است. هر دو متغیر/نمونه به دو مکان حافظه متفاوت برای عملیات خود اشاره می کنند/استفاده می کنند.

مثال مقایسه

برای روشن شدن تفاوت، اجازه دهید از این اطلاعات در دو مثال بالا استفاده کنیم مثال 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

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید