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

سرور مجازی NVMe

پایتون: شیء کپی عمیق و کم عمق

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


معرفی

در این مقاله ، ما نگاهی خواهیم انداخت عمیق و کپی کم عمق اشیاء در پایتون

پاسخ کوتاه این است که می توانید از روش های استفاده کنید 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

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

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

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