کپی و دیپ کپی در پایتون

کپی و دیپ کپی
کپی و دیپ کپی


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

اول بیاید با یک مثال شروع کنیم

a = 1
b = a
b += 1
print(a)

خب مطمئن هستیم که عدد ۱ رو پرینت میکنه ولی:

a = [1,2]
b = a
b.append(3)
print(a)

خب شما احتمالا فکر می کنید خروجی [1,2] هست ولی اشتباه می کنید و خروجی [1,2,3] هستش.

خوب ولی اگه از کپی و دیپ کپی استفاده کنیم:

import copy
a = [1,2]
b=copy.copy(a)
b.append(3)
print(a)

خب الان خروجی دو هست و همین قضیه برای دیپ کپی هم برقراره

import copy
a = [1,2]
b = copy.deepcopy(a)
print(a)
#output  -- > [1,2]

حالا فرق اینها چیه(copyو deepcopy و حالت معمولی)؟

assignment:

import copy
a = [1,2,3]
b = [4,5,6]
c = [a,b]
d = c
print(id(d) == id(c)) # --> True
print(id(d[0]) == id(c[0])) # --> True

این کد پاسخ درست می دهد چون d همان c است. و همچنین d[0] همان c[0] است.

copy:

import copy
a = [1,2,3]
b = [4,5,6]
c = [a,b]
d = copy.copy(c)
print(id(d) == id(c)) # --> False
print(id(d[0]) == id(c[0])) # --> True

اولی کد پاسخ False می دهد چون d یک لیست جدید است ولی دومی پاسخ True است چون که در copy.copy فقط خود لیست کپی می شود و محل اجزای داخل آن در رم برابر است مثلا محل c[0] و d[0] در رم با هم برابر است.

deepcopy:

import copy
a = [1,2,3]
b = [4,5,6]
c = [a,b]
d = copy.deepcopy(c)
print(id(d) == id(c)) # --> False
print(id(d[0]) == id(c[0])) # --> False

اولی کد پاسخ False می دهد چون d یک لیست جدید است و دومی هم پاسخ False می دهد چون که در deepcopy هم اجزا و هم خود لیست کپی می شوند و محل همه انها در رم متفاوت است.

به عنوان مثال اگر id(d[0])در 0x72b9df992000 رم قرار داشته باشد id(c[0]) در 0x742f53595f40 قرار دارد.


ممنون از اینکه این مطلب رو خوندید یادتون نره به سایت هم سر بزنید(البته هنوز ناقصه) با تشکر از همتون

لینک:https://mohammadjavad12.github.io/irnelm

خداحافظ.