سلام به همتون.محمدجواد حق بیگی هستم و اومدیم با یه آموزش جدید در این دفعه قراره کپی و دیپ کپی رو یادتون بدم که حلال خیلی از مشکلاتتونه.
اول بیاید با یک مثال شروع کنیم
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
خداحافظ.