Тест самоперевірки

Словники

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

У програмі мільйон записів «ім'я → телефон», і кожну секунду треба знаходити номер за іменем. Чому список пар тут гірший за словник?

Чому так. Список не має іншого способу, крім перебору: він порівнює шуканий ключ з кожним підряд. Словник обчислює адресу комірки з самого ключа, тому кількість записів на пошук не впливає. Памʼять — не аргумент: словник якраз тримає вільні комірки й зазвичай важить більше.
Питання 2 / 8

Ключа «Петро» у книзі немає. Чим книга.get("Петро", "немає") відрізняється від книга.setdefault("Петро", "немає")?

Чому так. Різниця саме в побічній дії: get тільки читає, а setdefault при відсутності ключа його створює. Тому після setdefault len(книга) збільшиться на одиницю, а після get — ні. Плутанина коштує дорого: словник тихо обростає ключами, яких туди ніхто не клав.
Питання 3 / 8

Ти зробив ключі = книга.keys(), а потім додав у книгу новий запис. Що тепер у змінній ключі?

Чому так. keys(), values() і items() повертають представлення (view) — вікна в той самий словник, які показують його поточний стан. Щоб отримати знімок, який більше не змінюється, треба явно написати list(книга.keys()). Саме на цьому ловляться ті, хто чекає від keys() списку.
Питання 4 / 8

У таблиці на 8 комірок ключ «Оля» дав хеш 1047570, отже цілиться в комірку 2 — але там уже лежить «Аня». Що зробить Python?

Чому так. Це колізія, і CPython розвʼязує її відкритою адресацією: детерміновано рахує наступного кандидата, поки не знайде вільну комірку. Оскільки формула детермінована, пошук потім пройде тим самим маршрутом і ключ знайдеться. «Аню» ніхто не чіпає — вона там законно.
Питання 5 / 8

Чому список не можна взяти за ключ словника?

Чому так. Адреса запису обчислена з ключа: змінився ключ — змінилась адреса, а значення лишилось лежати за старою. Дістатись до нього після цього неможливо. Тому в списку __hash__ дорівнює None, і TypeError падає ще на вставці. Кортеж ключем бути може — але тільки якщо всередині немає списків.
Питання 6 / 8

У словник додали «Аня», «Богдан», «Галя», потім видалили «Богдан» і додали його знову. Що поверне list(словник)?

Чому так. З Python 3.7 словник гарантує порядок саме вставки. Видалений ключ зникає з масиву записів, а доданий знову йде в кінець — для словника це нова вставка, а не повернення. Твердження «словник невпорядкований» правдиве лише для версій до 3.7.
Питання 7 / 8

Ти написав d = {1: "ціле"}, потім d[1.0] = "дробове", потім d[True] = "логічне". Що тепер у d?

Чому так. Правило Python: рівні значення мають рівні хеші, а 1 == 1.0 == True. Отже це один ключ, і два наступні присвоєння лише перезаписують значення. Ключ при цьому лишається тим, який поклали першим, — тому в результаті 1, а не True.
Питання 8 / 8

У словнику 5 ключів і таблиця на 8 комірок. Що станеться при вставці шостого?

Чому так. Хеш-таблиця не дає собі заповнитись більш ніж на дві третини: 2/3 від 8 — це 5.33, тому шостий ключ переповнює межу. Створюється нова таблиця, і кожен ключ отримує нову адресу, бо остача береться від іншого числа. Перевірити це можна через sys.getsizeof — розмір стрибає рівно на шостому ключі.