Skip to content

ב-Python, כאשר מבצעים השמה בין משתנים כמו list_b = list_a, לא נוצר עותק חדש של האובייקט. למעשה, שני המשתנים מצביעים על אותו אובייקט בזיכרון. כתוצאה מכך, כל שינוי ב-list_a ישפיע גם על list_b. כדי להימנע מהתנהגות זו, יש ליצור עותק מפורש של האובייקט.


שני סוגי העתקה

המודול copy כולל שתי פונקציות עיקריות:

  1. copy.copy: יוצרת העתקה רדודה (shallow copy).
  2. 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כאשר אתה זקוק לעצמאות מוחלטת מהאובייקט המקורי, במיוחד עבור מבנים מורכבים.

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *