از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون: شیء کپی عمیق و کم عمق
سرفصلهای مطلب
معرفی
در این مقاله ، ما نگاهی خواهیم انداخت عمیق و کپی کم عمق اشیاء در پایتون
پاسخ کوتاه این است که می توانید از روش های استفاده کنید copy
ماژول ، برای هر دو عمل:
import copy
shallow_copy_list = copy.copy(original_list)
deepcopy_list = copy.deepcopy(original_list)
با این حال، کپی کردن چیزی به صورت کم عمق یا عمیق به چه معناست؟
در بخشهای بعدی، به معنای این عبارات، روش برخورد پایتون با ارجاعات اشیا و اشیاء در حافظه، و چرا این دو روش به روشی که انجام می دهند کار می کنند.
کپی سطحی یک شی در پایتون
وقتی از دستورات تکلیف استفاده می کنیم (=
) در پایتون برای ایجاد کپی از اشیاء مرکب، مانند لیستها یا نمونههای کلاس یا اساساً هر آبجکتی که حاوی برخی دیگر از اشیاء است، پایتون خود شی را شبیهسازی نمیکند. در عوض، به سادگی مرجع را به شی مورد نظر متصل می کند.
تصور کنید که ما یک لیست با عناصر زیر در آن داریم:
original_list =((1,2,3), (4,5,6), ("X", "Y", "Z"))
اگر بخواهیم لیست اصلی خود را با استفاده از دستور انتساب به صورت زیر کپی کنیم:
shallow_copy_list = original_list
print(shallow_copy_list)
ممکن است به نظر برسد که ما شیء خود را شبیه سازی کرده ایم و اکنون دو مورد از آنها داریم:
((1,2,3), (4,5,6), ('X', 'Y', 'Z'))
اما آیا ما واقعاً دو شی داریم؟ نه، ما نداریم. ما دو تا داریم متغیرهای مرجع اشاره به همان شی در حافظه این را می توان به راحتی با چاپ شناسه شی در حافظه برای هر دو مورد تأیید کرد:
id(original_list)
id(shallow_copy_list)
با تلاش برای تغییر یک مقدار در هر یک از “دو لیست” می توان شاهد ملموس تری برای این امر مشاهده کرد – در حالی که در واقعیت، ما همان لیست را تغییر می دهیم، و هر دو اشاره گر به یک شی در حافظه اشاره می کنند.
اجازه دهید به آخرین عنصر شی که توسط آن اشاره شده است دسترسی پیدا کنیم original_list
:
original_list(-1)(-1) = "ZZZ"
print(original_list)
این نتیجه در:
((1, 2, 3), (4, 5, 6), ('X', 'Y', 'ZZZ'))
دانستن اینکه هر دو متغیر مرجع به یک شی، چاپ اشاره می کنند shallow_copy_list
همان نتیجه را برمیگرداند:
print(shallow_copy_list)
((1, 2, 3), (4, 5, 6), ('X', 'Y', 'ZZZ'))
کپی کم عمق هست process کپی کردن یک مرجع به یک شی و ذخیره آن در یک متغیر جدید. این
original_list
وshallow_copy_list
صرفاً ارجاعی هستند که به همان آدرسها در حافظه (RAM) اشاره میکنند که مقادیر آن را ذخیره میکنند((1, 2, 3), (4, 5, 6), ('X', 'Y', 'ZZZ'))
.
همچنین می توان یک کپی کم عمق از یک شی با استفاده از یک تکه از کل لیست و بیانیه انتساب ایجاد کرد:
slice_shallow_copy_list = original_list(:)
راه دیگر برای کپی کم عمق استفاده از copy
ماژول کتابخانه استاندارد پایتون
برای استفاده از copy
ماژول، ابتدا باید import آی تی:
import copy
حالا می توانیم از copy()
روش از copy
مدول:
second_shallow_copy_list = copy.copy(original_list)
هر دو را چاپ کنید تا ببینید که آیا به مقادیر یکسانی اشاره می کنند:
print(original_list)
print(second_shallow_copy_list)
همانطور که انتظار می رود، آنها انجام می دهند:
((1, 2, 3), (4, 5, 6), ('X', 'Y', 'ZZZ'))
((1, 2, 3), (4, 5, 6), ('X', 'Y', 'ZZZ'))
معمولاً میخواهید یک شی مرکب را کپی کنید، مثلاً در ابتدای یک روش، سپس کلون را تغییر دهید، اما شی اصلی را همانطور که بود نگه دارید تا بعداً دوباره از آن استفاده کنید.
برای رسیدن به این هدف، ما نیاز داریم کپی عمیق شی حالا بیایید یاد بگیریم کپی عمیق چیست و چگونه یک شی مرکب را عمیق کپی کنیم.
کپی عمیق یک شی در پایتون
کپی عمیق یک شی یعنی واقعا شبیه سازی شی و مقادیر آن در یک کپی (نمونه) جدید در حافظه، با همان مقادیر.
به جای ایجاد یک مرجع جدید به همان مقادیر، با کپی عمیق، میتوانیم در واقع یک شی جدید ایجاد کنیم که مستقل از دادههای اصلی است اما حاوی مقادیر یکسان است.
در یک کپی عمیق معمولی process، ابتدا یک مرجع شی جدید ایجاد می شود، سپس تمام اشیاء فرزند به صورت بازگشتی به شی والد اضافه می شوند.
به این ترتیب، بر خلاف یک کپی کم عمق، ایجاد هرگونه تغییر در شی اصلی، در شی کپی منعکس نمی شود (یا برعکس).
در اینجا یک تصویر ساده از یک کپی عمیق معمولی است:
برای کپی کردن یک شیء در پایتون ، ما از آن استفاده می کنیم deepcopy()
روش از copy
مدول.
اجازه دهید import ماژول کپی و ایجاد یک کپی عمیق از یک لیست:
import copy
original_list = ((1,2,3), (4,5,6), ("X", "Y", "Z"))
deepcopy_list = copy.deepcopy(original_list)
حالا وقته print لیست های ما برای اطمینان از یکسان بودن خروجی ها و همچنین شناسه های آنها به عنوان اثبات منحصر به فرد بودن آنها:
print(id(original_list), original_list)
print(id(deepcopy_list), deepcopy_list)
خروجی تایید می کند که ما یک کپی واقعی برای خودمان ایجاد کرده ایم:
4517599280, ((1, 2, 3), (4, 5, 6), ('X', 'Y', 'Z'))
4517599424, ((1, 2, 3), (4, 5, 6), ('X', 'Y', 'Z'))
حالا بیایید سعی کنیم لیست اصلی خود را با تغییر آخرین عنصر آخرین لیست به “O” و سپس تغییر دهیم print برای دیدن نتیجه:
original_list(-1)(-1) = "O"
print(original_list)
ما نتایج را همانطور که انتظار می رود دریافت می کنیم:
((1, 2, 3), (4, 5, 6), ('X', 'Y', 'O'))
حالا اگر پیش برویم و سعی کنیم print لیست کپی ما:
print(deepcopy_list)
اصلاح قبلی منعکس نشده است روی این لیست:
((1, 2, 3), (4, 5, 6), ('X', 'Y', 'Z'))
به یاد داشته باشید که copy()
و deepcopy()
روش ها قابل اجرا هستند روی سایر اشیاء مرکب این بدان معنی است که می توانید از آنها برای ایجاد کپی از نمونه های کلاس نیز استفاده کنید.
نتیجه
در این مقاله، معنی کپی کم عمق و کپی عمیق یک شی را یاد گرفتیم.
ما همچنین یاد گرفتیم که می توانیم از copy()
روش از copy
ماژول برای ایجاد یک کپی کم عمق ، و deepcopy()
روشی برای ایجاد یک کپی عمیق از اشیاء مرکب.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-08 12:50:11