שאלה על copy() ו-id במחברת 5

אז באחת הדוגמאות של הפעולה id
יש את התרגול הבא:
גרמו לכך שהקוד שמוסיף את הערך 100 לרשימה הראשונה לא ישפיע על שאר הרשימות.

collections_of_numbers = [[0, 0, 0]] * 3
print(collections_of_numbers)
collections_of_numbers[0].append(100)
print(collections_of_numbers)

אז כדי להוסיף 100 רק לתת רשימה הראשונה, שיניתי את השורה הראשונה ל:
collections_of_numbers = [[0, 0, 0], [0, 0, 0], [0, 0, 0]
וזה עבד.

אבל, למה בשימוש ב
copy
זה לא מסתדר?

למשל:
collections_of_numbers = [[0, 0, 0]]
x = collections_of_numbers.copy()
new_collections_of_numbers = collections_of_numbers + x + x
print(new_collections_of_numbers)
new_collections_of_numbers[0].append(100)
print(new_collections_of_numbers)

שימוש ב־copy משכפל רק את הרשימה החיצונית, לא את כל המבנה

אם ככה, אז x היה צריך להיות רשימה ריקה, לא?

לא, כי המבנה החיצוני הוא רשימה בת שלושה “לייזרים”.
הוא יוצר את הלייזרים מחדש, אבל הם מצביעים לאותו מיקומים.

לייק 1

מצאתי שזה גם פתרון (זה כתיבה מקוצרת של for שראיתי בדוקומנטציה):
collections_of_numbers = [[0 for i in range(3)] for j in range(3)]

זו בהחלט דרך אפשרית - זה מה שנקרא list comprehension וזה נמצא תחת שבוע 6 לפי הסילבוס.

לייק 1