ساختن کپی های عمیق
بیایید مثال قبلی کپی کردن لیست را تکرار کنیم، اما با یک تفاوت مهم. این بار میخواهیم یک کپی عمیق با استفاده از تابع deepcopy() که در ماژول کپی تعریف شده است:>>> xs = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> import copy >>> zs = copy.deepcopy(xs)هنگامی که xs و کلون zs آن را که ما با آن ایجاد کردیم بررسی می کنید copy.deepcopy()، خواهید دید که هر دو دوباره یکسان به نظر می رسند – فقط مانند مثال قبل:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> xs >>> zs [[1, 2, 3], [4, 5, 6], [7, 8, 9]]شی اصلی (xs)، خواهید دید که این اصلاح بر روی آن تأثیر نمی گذارد کپی عمیق (zs). با این حال، اگر تغییری در یکی از اشیاء فرزند در آن ایجاد کنید xs به صورت بازگشتی کلون شد، از جمله تمام اشیاء فرزند آن:>>> xs[1][0] = ‘X’ هر دو شی، اصل و کپی، این بار کاملاً مستقل هستند. [[1, 2, 3], [‘X’, 5, 6], [7, 8, 9]] >>> xs >>> zs [[1, 2, 3], [4, 5, 6], [7, 8, 9]]ممکن است بخواهید کمی وقت بگذارید و با مترجم پایتون بنشینید و همین الان با این مثال ها بازی کنید. کاغذ بسته بندی وقتی به تجربه دست می یابید، سرتان در اطراف کپی کردن اشیاء آسان تر است و با مثال ها دست اول بازی کنید. به هر حال، شما همچنین می توانید با استفاده از یک تابع در کپی های کم عمق ایجاد کنید اشیاء. ماژول کپی تابع copy.copy () کپی های کم عمقی از این در صورتی مفید است که بخواهید به طور واضح ارتباط برقرار کنید که در حال ایجاد یک هستید در جایی از کد خود کپی کنید. استفاده از copy.copy () به شما امکان می دهد این واقعیت را مشخص کنید. با این حال، برای مجموعه های داخلی بیشتر در نظر گرفته شده است پایتونیک به سادگی از لیست، دستور و تنظیم توابع کارخانه برای ایجاد استفاده می کند کپی های کم عمقسوالی که هنوز باید به آن پاسخ دهیم این است که چگونه میتوانیم کپیهایی (شال کم و عمیق) از اشیاء دلخواه، از جمله کلاسهای سفارشی ایجاد کنیم. بیایید حالا به آن نگاهی بینداز کپی کردن اشیاء دلخواه دوباره ماژول کپی به کمک ما می آید. آن copy.copy() and توابع copy.deepcopy() را می توان برای کپی کردن هر شی مورد استفاده قرار داد. یک بار دیگر، بهترین راه برای درک نحوه استفاده از اینها با a است آزمایش ساده من این را بر اساس کپی کردن لیست قبلی قرار خواهم داد مثال. بیایید با تعریف یک کلاس نقطه دو بعدی ساده شروع کنیم:def __init__(self, x, y): class Point: self.x = x def __repr__(self): self.y = y return f’Point({self.x!r}, {self.y!r})’پیاده سازی __repr__() تا بتوانیم به راحتی اشیا را بررسی کنیم از این کلاس در مفسر پایتون ایجاد شده است. امیدوارم موافق باشید که این خیلی ساده بود. الف اضافه کردم در مرحله بعد، یک نمونه Point ایجاد می کنیم و سپس (به صورت کم عمق) آن را کپی می کنیم. با استفاده از ماژول کپی: >>> b = copy.copy(a)اگر محتویات شی Point اصلی و (کم عمق) آن را بررسی کنیم کلون، ما آنچه را که انتظار داریم می بینیم:>>> a >>> a = Point(23, 42) Point(23, 42) Point(23, 42) >>> b >>> a is b Falseدر اینجا چیز دیگری وجود دارد که باید در نظر داشت. زیرا شی نقطه ما استفاده می کند انواع اولیه (ints) برای مختصات آن، هیچ تفاوتی بین آنها وجود ندارد یک کپی کم عمق و عمیق در این مورد. اما مثال را در آن بسط خواهم داد.
قوانین ارسال دیدگاه در سایت