Contents
- ב-Python, כאשר מבצעים השמה בין משתנים כמו
list_b = list_a
, לא נוצר עותק חדש של האובייקט. למעשה, שני המשתנים מצביעים על אותו אובייקט בזיכרון. כתוצאה מכך, כל שינוי ב-list_a
ישפיע גם עלlist_b
. כדי להימנע מהתנהגות זו, יש ליצור עותק מפורש של האובייקט. - שני סוגי העתקה
- העתקה רדודה (
copy.copy
) - העתקה עמוקה (
copy.deepcopy
) - מתי להשתמש?
ב-Python, כאשר מבצעים השמה בין משתנים כמו list_b = list_a
, לא נוצר עותק חדש של האובייקט. למעשה, שני המשתנים מצביעים על אותו אובייקט בזיכרון. כתוצאה מכך, כל שינוי ב-list_a
ישפיע גם על list_b
. כדי להימנע מהתנהגות זו, יש ליצור עותק מפורש של האובייקט.
שני סוגי העתקה
המודול copy
כולל שתי פונקציות עיקריות:
copy.copy
: יוצרת העתקה רדודה (shallow copy).copy.deepcopy
: יוצרת העתקה עמוקה (deep copy).
ההבדל המרכזי ביניהן הוא אופן ההתמודדות עם אובייקטים מקוננים, כלומר מבנים המכילים אובייקטים נוספים בתוכם (כמו רשימות של רשימות).
העתקה רדודה (copy.copy
)
העתקה רדודה יוצרת אובייקט חדש, אך שומרת על הפניות לאובייקטים המקוננים בתוך האובייקט המקורי. כלומר, אם יש למשל רשימה בתוך רשימה, היא לא תועתק — אלא רק תצוין באובייקט החדש.
import copy
# רשימה מקורית
original_list = [1, 2, [3, 4]]
# עותק רדוד
shallow_copy = copy.copy(original_list)
print(f"original_list: {original_list}") # יוצא: [1, 2, [3, 4]]
print(f"shallow_copy: {shallow_copy}") # יוצא: [1, 2, [3, 4]]
# שינוי הרשימה המקוננת באובייקט המקורי
original_list[2][0] = 5
print(f"original_list after change: {original_list}") # יוצא: [1, 2, [5, 4]]
print(f"shallow_copy after change: {shallow_copy}") # יוצא: [1, 2, [5, 4]]
הסבר: מאחר שהרשימה [3, 4]
נשמרה כהפניה משותפת, כל שינוי בה משתקף גם בעותק הרדוד.
העתקה עמוקה (copy.deepcopy
)
בשונה מהעתקה רדודה, העתקה עמוקה מבצעת שכפול רקורסיבי של כל האובייקטים המקוננים. היא יוצרת עותקים עצמאיים לחלוטין של כל רכיב במבנה הנתונים.
import copy
# רשימה מקורית
original_list = [1, 2, [3, 4]]
# עותק עמוק
deep_copy = copy.deepcopy(original_list)
print(f"original_list: {original_list}") # יוצא: [1, 2, [3, 4]]
print(f"deep_copy: {deep_copy}") # יוצא: [1, 2, [3, 4]]
# שינוי הרשימה המקוננת באובייקט המקורי
original_list[2][0] = 5
print(f"original_list after change: {original_list}") # יוצא: [1, 2, [5, 4]]
print(f"deep_copy after change: {deep_copy}") # יוצא: [1, 2, [3, 4]]
הסבר: מאחר ש-deepcopy
יצר עותק עצמאי לחלוטין של תת-הרשימה, השינוי באובייקט המקורי לא השפיע על העותק.
מתי להשתמש?
סוג העתקה | מתי להשתמש |
---|---|
copy.copy | כאשר אינך זקוק להעתקה מלאה של מבנים מקוננים, והביצועים חשובים. |
copy.deepcopy | כאשר אתה זקוק לעצמאות מוחלטת מהאובייקט המקורי, במיוחד עבור מבנים מורכבים. |