Одна ідея на всі три рівні: імʼя вказує на обʼєкт, а не вміщує його. Кожне завдання перевіряє, чи ти справді користуєшся цією моделлю, а не звичною «коробкою зі значенням».
Усе роби в окремому файлі dz_03.py або в новому зошиті. Кожен пункт має щось
друкувати — інакше нема чого перевіряти.
рівень 1Рівень 1 — База
Повтори головний дослід лекції на своїх даних.
- Створи список із трьох улюблених фільмів і дай йому імʼя
фільми. - Дай тому самому списку друге імʼя
улюблене. - Додай четвертий фільм через друге імʼя (
улюблене.append(...)). - Надрукуй
фільмиі доведи двома різними способами, що обʼєкт один: черезфільми is улюбленеі через порівнянняid(фільми)зid(улюблене). - Тепер зроби
справжня_копія = фільми.copy(), додай туди пʼятий фільм і надрукуй обидва списки поруч.
Зроблено, якщо: у виводі видно, що після кроку 3 у фільми чотири назви,
is і порівняння id() обидва дають True, а після кроку 5 два списки
відрізняються й фільми is справжня_копія дає False.
рівень 2Рівень 2 — Плюс
Тут .copy() тебе підведе — і треба зрозуміти чому.
- Створи
розклад = [["пн"], ["вт"]]— список, усередині якого лежать списки. - Зроби
копія = розклад.copy(). - Виконай
копія[0].append("математика"). - Надрукуй
розкладікопія. Потім надрукуйрозклад[0] is копія[0]. - Напиши коментарем 3–5 речень: скільки всього обʼєктів у памʼяті після кроку 2,
що саме скопіював
.copy(), і чому зміна всерединікопія[0]видно врозкладі. - Знайди спосіб зробити копію, яка від цього захищена (підказка: модуль
copy), і повтори кроки 3–4 з нею.
Зроблено, якщо: у виводі видно, що після .copy() слово «математика»
зʼявилось в обох списках, розклад[0] is копія[0] дає True,
пояснення написане своїми словами, а з другим способом копіювання той самий
розклад лишається без змін.
рівень 3Рівень 3 — Виклик
Дослідження на межі: коли is бреше.
- Напиши три рядки коду, після яких
a == bдаєTrue, аa is b—False. - Напиши три рядки, після яких обидва оператори дають
True. - Для кожної пари надрукуй
id(a),id(b)і коментарем поясни, скільки обʼєктів створено. - Знайди експериментально межу кешу цілих чисел: перевір
a is bдляa = n,b = int(str(n))приn, що дорівнює 255, 256, 257, 258, і надрукуй результат для кожного. - Одним абзацом відповідай на питання: чому результат пункту 4 не можна використовувати в робочому коді, навіть якщо він стабільно відтворюється на твоєму компʼютері.
Зроблено, якщо: обидві пари з пунктів 1–2 працюють як заявлено, у виводі пункту 4 видно зміну відповіді десь між 256 і 257, а в поясненні названо головне: це деталь реалізації CPython, а не гарантія мови.
Підказки
- Якщо не впевнений, що відбувається, — друкуй
id()до і після кожної дії. Номер не змінився, а вміст змінився? Значить, обʼєкт той самий, і його бачать усі імена. - Питай себе про кожен рядок лише дві речі: скільки тут створено обʼєктів і що робить рядок — чіпляє ярлик чи міняє обʼєкт зсередини.
- У рівні 2 корисно намалювати на папері квадратики-обʼєкти й стрілки-імена, як в інтерактиві 1. Помилку зазвичай видно ще до запуску коду.
- У рівні 3 не бери числа з літералів в одному рядку: усередині одного блоку коду
компілятор може склеїти однакові сталі, і дослід зіпсується.
int(str(n))гарантовано будує окремий обʼєкт.