Python: задачки и вопросы
7.46K subscribers
1.3K photos
1 video
1 file
120 links
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков

Разместить рекламу: @tproger_sales_bot

Правила общения: https://tprg.ru/rules

Другие каналы: @tproger_channels

Другие наши проекты: https://tprg.ru/media
Download Telegram
Развёрнутое пояснение

1️⃣Выражение 𝚊 = 𝚋 = [𝟷, 𝟸] вычисляет список один раз и присваивает ссылку на него обеим переменным 𝚊 и 𝚋 — они указывают на один и тот же объект.​

2️⃣Вызов 𝚊.𝚊𝚙𝚙𝚎𝚗𝚍(𝟹) модифицирует этот список на месте: теперь он содержит [𝟷, 𝟸, 𝟹], и обе переменные видят это изменение.

3️⃣Выражение 𝚋 = 𝚋 + [𝟺] создаёт новый список из элементов 𝚋 плюс элемент 𝟺, и перепривязывает переменную 𝚋 к этому новому списку [𝟷, 𝟸, 𝟹, 𝟺]; переменная 𝚊 продолжает указывать на старый объект.​

4️⃣Функция 𝚙𝚛𝚒𝚗𝚝(𝚊, 𝚋) выводит [1, 2, 3] [1, 2, 3, 4].

Почему это важно
Задача демонстрирует разницу между мутацией объекта (𝚊𝚙𝚙𝚎𝚗𝚍, +=) и созданием нового объекта (+). При цепочке присваиваний с изменяемыми объектами легко получить неожиданное разделение состояния между переменными.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Что выведет код в Python 3?
Anonymous Quiz
48%
[5, 5, 5]
24%
[0, 1, 2]
20%
NameError
9%
SyntaxError
Развёрнутое пояснение

1️⃣Внутри тела класса 𝙰 создаётся атрибут 𝚡 = 𝟻.

2️⃣Затем начинается list comprehension [𝚡 𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟹)]; в Python 3 это выражение компилируется как отдельная вложенная функция со своей областью видимости.

3️⃣Итерируемый объект 𝚛𝚊𝚗𝚐𝚎(𝟹) вычисляется в области видимости класса (это работает), но выражение 𝚡 внутри comprehension ищется в локальной области comprehension, затем в глобальной — область класса пропускается.

4️⃣Поскольку 𝚡 не найден ни локально, ни глобально, выбрасывается NameError: name 'x' is not defined.

Почему это важно
Это неочевидное поведение часто ломает код при портировании с Python 2 на 3. Решение — вынести значение в итерируемое: [𝚡 𝚏𝚘𝚛 𝚡 𝚒𝚗 [𝚡] 𝚏𝚘𝚛 𝚒 𝚒𝚗 𝚛𝚊𝚗𝚐𝚎(𝟹)] или использовать значение по умолчанию в лямбде.
Please open Telegram to view this post
VIEW IN TELEGRAM
🙈2👍1