Python з нуля · Тема 03 · Тест самоперевірки

Змінні та обʼєкти

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

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

a = [1, 2] · b = a · b.append(3). Що надрукує print(a)?

Чому так. b = a не копіює список, а чіпляє на нього другий ярлик. Обʼєкт один на два імені, тому b.append(3) змінює те, що бачить і a. Відповідь «[1, 2]» була б правильною лише для b = a.copy().
Питання 2 / 8

Після x = 5 · y = x · y = y + 1 значення x лишилось 5. Чому?

Чому так. Змінити число неможливо в принципі — int незмінний. Вираз y + 1 будує новий обʼєкт 6 і перечіпляє на нього ярлик y; обʼєкт 5 лишається неторканим, і x досі вказує саме на нього. Ніякого копіювання при присвоєнні не буває — ні для чисел, ні для списків.
Питання 3 / 8

a = [1, 2] · b = [1, 2]. Що дадуть a == b і a is b?

Чому так. == питає про значення — вміст однаковий, тому True. is питає про ідентичність — це два окремі обʼєкти з різними id(), тому False. Саме тут найчастіше й помиляються, підставляючи is замість ==.
Питання 4 / 8

a = 200 · b = 200 дає a is b → True, а для 1000 у REPL — False. Що це означає?

Чому так. CPython наперед створює цілі від −5 до 256 і роздає їх повторно — це оптимізація конкретної реалізації, а не правило мови. Межа може змінитись, а той самий код у файлі й у REPL здатен дати різні відповіді. Тому числа порівнюють через ==, і покладатись на is не можна.
Питання 5 / 8

На список вказують імена a і b. Виконали del a. Що сталося з обʼєктом?

Чому так. del відчіпляє ярлик, а не знищує обʼєкт. Лічильник посилань зменшився з 2 до 1, і памʼять звільниться лише тоді, коли зникне останнє імʼя. Звернення до a після цього дасть NameError, а b працюватиме як і раніше.
Питання 6 / 8

Функція оголошена як def додати(що, кошик=[]). Її викликали тричі без другого аргументу. Що поверне третій виклик?

Чому так. Порожній список створюється один раз, коли Python читає рядок def, і назавжди лишається прикріпленим до функції. Кожен виклик дописує у той самий обʼєкт, тому після трьох викликів у ньому три елементи. Ліки — кошик=None і створення списку всередині функції.
Питання 7 / 8

пара = ([1, 2], "текст") · пара[0].append(3). Що станеться?

Чому так. Незмінність кортежа означає лише те, що зафіксовано набір посилань: замінити пара[0] на інший обʼєкт не вийде. Але сам список за цим посиланням — змінюваний, і append спокійно спрацює. Кортеж при цьому той самий: id() не змінився.
Питання 8 / 8

Чому спроба поміняти значення місцями рядками a = b, а потім b = a, не працює?

Чому так. Перший рядок перечіпляє ярлик a на обʼєкт, який тримає b. На старий обʼєкт не лишається жодного посилання — він знищується, і дістати його вже нічим. Другий рядок просто повторює те саме. Тому й потрібне або третє імʼя, або запис a, b = b, a, де правий бік обчислюється до роздачі імен.