Джерело
Сповідь тестувальника | Про Python (і не тільки).Продовження попередньої частини.Частина 🔤Буде...
261 Охват/переглядів
2026-01-19 07:03
Повідомлення №61
Про Python (і не тільки).Продовження попередньої частини.Частина 🔤Будемо їсти цього "слона" шматочками. Отже, зупинилися на тому, що змінні це не скрині. Що тоді? Мітки, ярлики (якщо простою мовою). Ідентифікатори (якщо казати суворіше). Але не лише, бо всі ці терміни наче є синонімами до слова "ім'я", але наші змінні є чимось більшим. Вони не лише ім'я (хоча тільки його ми бачимо у коді), але й вказівник на місце у пам'яті, де зберігаються дані. Простіша, але правильна аналогія — вони це ярлик, на якому ми написали ім'я та причепили на дані.Чи можна на одні й ті самі дані начепити кілька ярликів? Або: чи може декілька ідентифікаторів вказувати на одну й ту саму область в пам'яті? Так, все це може бути. І саме це ми й бачили у попередньому дописі.Пригадаємо, що ми робили таке:y = x
І тут ми, як вже знаємо, не створювали скриню, хоча й визначили нове ім'я — "y". І тепер ім'я "y" вказує на ті самі дані, що створилися раніше, коли ми написали таке:x = ['A', 'B']
Щоб не копати надто глибоко, скажу, що однією з причин такої поведінки є економія пам'яті комп'ютера, де зберігаються дані програми.Отже, цей код:x = ['A', 'B']y = x
зробив наступне:1. В пам'яті зберіг дані: список ['A', 'B']2. Створив нове ім'я "х"3. Зв'язав ім'я "х" з даними (нашим списком)4. Створив нове ім'я "у"5. Зв'язав ім'я "у" з тими ж(!) даними (на які вказує х)Або: повісив на наш список два ярлика: "х" та "у".Ми отримали ситуацію, коли два імені вказують на одні й ті самі дані. Кажучи суворіше — вказують на однакову область в пам'яті (де зберігаються наші дані).Частина 🔤Що відбулося потім? Потім ми зробили це:x.append('C')
, і ця команда додала новий елемент до списку, не змінюючи його місця у пам'яті. Просто список став довше.А наші змінні х та у, як і раніше, продовжують на цей список вказувати. Ярлики ніхто не зривав.Зверніть увагу: виконуючи команду x.append(), ми наче застосовуємо її до змінної х, правда? Але ми вже з'ясували, що змінні не є скринями. Отже, механізм дещо інший. Python побачив ім'я "х", звісно. Але далі пішов за адресою, куди наш "х" вказує. І всі зміни відбулися в пам'яті, над даними.Наче як сказати: "Серед мішків на складі знайди той, на якому ярлик з надписом "х" та додай до мішка ось це яблуко"Імена "х" та "у" так і лишилися іменами, вказівниками на дані. Змінилися самі дані, все інше залишилося.Саме тому, коли ми в кінці надрукували значення:print(x)print(y)
, то отримали однаковий результат. Бо обидві змінні вказують на однакові дані. Цікаво, чи буде різниця, якщо викликати команду для збільшення списку через ім'я y замість x? Ось так:y.append('C')
Ви вже знаєте відповідь. Результат буде таким самим. Яка різниця, якщо я покладу яблуко у мішок з ярликом "у", адже це той самий мішок, на якому і ярлик "х"?Не скриньки. Лише ідентифікатори з вказівниками на дані. Ярлики на мішках на складі.Але і це ще не всі ракурси теми, бо в інших випадках аналогія з мішком стає дещо недолугою та потребує доповнення.❗️Діятимо далі за тим самим принципом: залишайте вподобайки, і я продовжу.