خبر و ترفند روز

خبر و ترفند های روز را اینجا بخوانید!

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

گاهی اوقات، شما یک کپی کامل از یک شی را می خواهید، در برخی مواقع می خواهید که از منابع استفاده کند. تفاوت ها را در عمل ببینید.

پایتون چندین روش کارآمد برای مدیریت داده ها ارائه می دهد. درک مفاهیم کپی کم عمق و عمیق هنگام کار با ساختارهای داده مانند لیست های تودرتو، دیکشنری ها یا اشیاء سفارشی بسیار مهم است.

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

استفاده از کپی کم عمق

کپی کم عمق با ایجاد یک کپی از ساختار سطح بالای شی اصلی کار می کند. این بدان معنی است که اگر شی اصلی حاوی اشیاء تودرتو باشد، کپی به همان اشیاء تودرتو اشاره می کند که نمونه اصلی دارد. به عبارت دیگر، ساختن یک کپی کم عمق از یک شی، بیرونی ترین ساختار آن را کپی می کند، نه هر شی تودرتویی که ممکن است حاوی آن باشد.

برای انجام یک کپی کم عمق در پایتون، می‌توانید از تابع copy() ماژول کپی یا متد ()copy روی شی استفاده کنید.

نمونه ای از کار با لیست یا فرهنگ لغت در پایتون را در نظر بگیرید.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the nested list
shallow_copy[2][0] = 99
main_list[2][1] = 100

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

در کد بالا، متغیر main_list یک لیست حاوی اعداد صحیح و یک لیست داخلی (شیء تودرتو) حاوی حروف را در خود دارد. تابع copy یک کپی از main_list ایجاد می کند که کد در متغیر دیگری به نام shallow_copy ذخیره می کند.

هر تغییری که در لیست تودرتو shallow_copy ایجاد کنید مستقیماً بر روی main_list و بالعکس تأثیر می گذارد. این تغییرات نشان می‌دهد که فهرست تودرتو یا درونی shallow_copy فقط اشاره‌ای به فهرست main_list است و باعث می‌شود تغییرات در main_list نیز اعمال شود.

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

در همین حال، هر تغییری که در آیتم‌های بیرونی (اعداد صحیح) در shallow_copy یا main_list ایجاد شود، تنها بر آن نمونه تأثیر می‌گذارد. این آیتم‌های بیرونی به خودی خود ارزش‌های مستقلی هستند، نه فقط ارجاعات.

import copy

main_list = [29, 49, ["Q", "R"]]
shallow_copy = copy.copy(main_list)

# Modify the outer items
shallow_copy[0] = "M"
main_list[1] = "N"

print(f"The main list: {main_list}")
print(f"The shallow copy list: {shallow_copy}")

خروجی نشان می دهد که هر دو آیتم بیرونی لیست مستقل از یکدیگر هستند:

مطلب مرتبط:   مدیریت ورودی های صفحه کلید در Arcade Library Games Python

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

همین ایده هنگام کار با فرهنگ لغت نیز صدق می کند.

dict1 = {'ten': 10, 'twenty': 20, 'double':{'thirty': 30, 'sixty': 60}}
dict2 = dict1.copy()

# Modify inner and outer elements
dict1['double']['thirty'] = 30.00
dict1['ten'] = 10.00

print(f"The main dictionary, {dict1}")
print(f"The shallow copy dictionary, {dict2}")

تغییرات ایجاد شده در فرهنگ لغت تودرتوی dict1 بر روی dict1 و dict2 تأثیر می گذارد. در عین حال، تغییرات در موارد بیرونی dict1 فقط بر آن تأثیر می گذارد.

با استفاده از کپی کم عمق با فرهنگ لغت تودرتو

با استفاده از کپی عمیق

به جای ارجاع به اشیاء تودرتوی کپی اصلی، یک کپی عمیق یک کپی کاملا مجزا از شی اصلی و اشیاء تودرتوی آن ایجاد می کند. تغییر کپی عمیق بر شی اصلی تأثیر نمی گذارد و بالعکس. آنها واقعاً مقادیر جداگانه ای هستند.

برای ایجاد یک کپی عمیق در پایتون، از تابع deepcopy() ماژول کپی استفاده کنید.

نمونه ای از کار با لیست را در نظر بگیرید.

import copy

main_list = [200, 300, ["I", "J"]]
deep_copy = copy.deepcopy(main_list)

# Modify the inner and outer list
deep_copy[2][0] = "K"
main_list[0] = 500

print(f"The main list: {main_list}")
print(f"The deep copy list: {deep_copy}")

در اینجا، کد یک کپی عمیق از main_list را انجام می دهد و یک کپی مستقل به نام deep_copy ایجاد می کند.

وقتی فهرست تودرتو یا موارد بیرونی را در deep_copy تغییر می‌دهید، تغییرات شما بر فهرست اصلی تأثیر نمی‌گذارد و بالعکس. این نشان می دهد که لیست تودرتو یا عناصر بیرونی بین دو نسخه به اشتراک گذاشته نمی شود.

با استفاده از کپی عمیق با لیست تودرتو

کار با اشیاء سفارشی

شما می توانید با تعریف یک کلاس پایتون و ایجاد یک نمونه از کلاس، یک شی سفارشی ایجاد کنید.

مطلب مرتبط:   نحوه اضافه کردن هایلایت سینتکس به یک کد بلاک در React

در اینجا مثالی از ایجاد یک شی ساده از یک کلاس Book آورده شده است:

class Book:
    def __init__(self, title, authors, price):
        self.title = title
        self.authors = authors
        self.price = price

    def __str__(self):
        return f"Book(title='{self.title}', author='{self.authors}', \
price='{self.price}')"

اکنون، یک کپی کم عمق و یک کپی عمیق از نمونه ای از این کلاس Book با استفاده از ماژول کپی ایجاد کنید.

import copy

# Create a Book object
book1 = Book("How to MakeUseOf Shallow Copy", \
             ["Bobby Jack", "Princewill Inyang"], 1000)

# Make a shallow copy
book2 = copy.copy(book1)

# Modify the original object
book1.authors.append("Yuvraj Chandra")
book1.price = 50

# Check the objects
print(book1)
print(book2)

همانطور که می بینید، کپی کم عمق (book2) یک شی جدید است، اما به همان شی داخلی (فهرست نویسنده) به عنوان شی اصلی (book1) اشاره می کند. بنابراین، تغییر در نویسندگان شی اصلی بر هر دو نمونه (کتاب 1 و کتاب 2) تأثیر می گذارد، در حالی که تغییر در مورد بیرونی (قیمت) فقط بر شی اصلی (کتاب1) تأثیر می گذارد.

با استفاده از کپی کم عمق با شی سفارشی

از سوی دیگر، ساختن یک کپی عمیق، یک کپی مستقل از شی اصلی، شامل کپی‌هایی از تمام اشیاء موجود در آن، ایجاد می‌کند.

# Create a Book object
book1 = Book("Why MakeUseOf Deep Copy?", \
             ["Bobby Jack", "Yuvraj Chandra"], 5000)

# Make a deep copy
book2 = copy.deepcopy(book1)

# Modify the original object
book1.authors.append("Princewill Inyang")
book1.price = 60

# Check the objects
print(book1)
print(book2)

در این صورت کپی عمیق (book2) یک شی کاملا مستقل است و تغییر شی اصلی (book1) تاثیری بر آن ندارد.

با استفاده از کپی عمیق با شی سفارشی

برای کپی کم عمق و کپی عمیق استفاده می شود

درک کپی عمیق و کم عمق بسیار مهم است تا بتوانید روش مناسب برای دستکاری داده ها را انتخاب کنید. در اینجا چند سناریو وجود دارد که در آن هر روش قابل اجرا است:

  • اگر می‌خواهید یک شی پیچیده را بدون ایجاد نمونه‌های جدیدی از اشیاء تودرتوی آن تکرار کنید، از یک کپی سطحی استفاده کنید. این رویکرد حافظه کارآمدتر و سریعتر از کپی عمیق است زیرا اشیاء تو در تو را کپی نمی کند.
  • از یک کپی کم عمق برای ایجاد یک عکس فوری از وضعیت یک شی استفاده کنید و در عین حال برخی از داده های اساسی را بین اشیاء اصلی و کپی شده به اشتراک بگذارید.
  • اگر می‌خواهید یک کپی از یک شی را بدون تأثیرگذاری بر روی اصل تغییر دهید، از یک کپی عمیق استفاده کنید. این کار کپی‌های مستقلی از اشیاء تودرتو ایجاد می‌کند و اطمینان می‌دهد که هر گونه تغییر در کپی روی نسخه اصلی اعمال نمی‌شود.
  • هنگامی که به کپی های مستقل از ساختارهای داده تودرتو نیاز دارید، کپی عمیق بسیار مهم است، عمدتاً زمانی که با سلسله مراتب اشیاء بازگشتی یا پیچیده سروکار دارید.
مطلب مرتبط:   نحوه ساخت اپلیکیشن دوربین با استفاده از پایتون

عملکرد و ملاحظات

از آنجایی که کپی کم عمق نمونه های جدیدی از اشیاء تودرتو ایجاد نمی کند، معمولاً سریعتر اجرا می شود و از حافظه کمتری نسبت به کپی عمیق استفاده می کند. با این حال، نسخه اصلی و کم عمق ممکن است عوارض جانبی ناخواسته ای از تغییر موارد داخلی مشترک داشته باشد.

به خصوص برای ساختارهای داده بزرگ و عمیق تو در تو، کپی عمیق، یک رویه بازگشتی، می تواند کندتر باشد و از حافظه بیشتری استفاده کند. با این حال، استقلال کامل بین نسخه اصلی و تکراری عمیق را تضمین می کند و دستکاری داده های پیچیده را ایمن تر می کند.

بهترین گزینه کپی برای داده های شما

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

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