В этом примере список 𝚡 создаётся при определении 𝚏𝚞𝚗, и каждый вызов 𝚏𝚞𝚗() добавляет в него единицу. Поэтому после первого вызова выводится [𝟷], а после второго уже [𝟷, 𝟷]. Такой эффект ловит многих: кажется, будто 𝚡 — новый пустой список при каждом вызове, но на деле это один и тот же, постоянно растущий список.
Чтобы избежать такого поведения, используйте 𝙽𝚘𝚗𝚎 как значение по умолчанию — тогда новый список создаётся при каждом вызове:
𝚍𝚎𝚏 𝚏𝚞𝚗(𝚡=𝙽𝚘𝚗𝚎):
𝚒𝚏 𝚡 𝚒𝚜 𝙽𝚘𝚗𝚎:
𝚡 = [ ]
𝚡.𝚊𝚙𝚙𝚎𝚗𝚍(𝟷)
𝚛𝚎𝚝𝚞𝚛𝚗 𝚡
Теперь каждый раз будет новый список: [𝟷] — поведение ожидаемое и безопасное для задач, где нужны независимые коллекции.
Эта особенность касается любых изменяемых типов: списков, словарей и даже пользовательских объектов. Полезно обратить на это внимание при проектировании функций‑инструментов и обработчиков.
✍4
Что выведет код в Python 3?
Anonymous Quiz
51%
['a', 'b', 'c'], 2
10%
['a', 'b', 'c'], 3
25%
['b', 'c'], 2
14%
Error
❤2👍1
Разбор по шагам:
Views — это не копии, а «живые» ссылки на словарь, экономящие память и время. В отличие от Python 2 (где 𝚍𝚒𝚌𝚝.𝚔𝚎𝚢𝚜() возвращал список-копию), в Python 3 представления всегда динамичны. Если бы код использовал 𝚕𝚒𝚜𝚝(𝚍.𝚔𝚎𝚢𝚜()) в начале, то 𝚘𝚕𝚍_𝚔𝚎𝚢𝚜 = 𝚕𝚒𝚜𝚝(𝚍.𝚔𝚎𝚢𝚜()), добавление 'c' не повлияло бы на 𝚘𝚕𝚍_𝚔𝚎𝚢𝚜 — оно осталось бы ['a', 'b'].
Please open Telegram to view this post
VIEW IN TELEGRAM
✍1
Что выведет код в Python 3?
Anonymous Quiz
55%
[1, 2, '3', '10', '20']
19%
['10', '20', '3', 1, 2]
16%
[1, 2, '10', '20', '3']
10%
Error
❤1
Разбор по шагам:
Подводные камни:
Вариант устойчивого ключа:
𝚍𝚎𝚏 𝚔(𝚡):
𝚝𝚛𝚢:
𝚛𝚎𝚝𝚞𝚛𝚗 (𝚒𝚜𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎(𝚡, 𝚜𝚝𝚛), 𝚒𝚗𝚝(𝚡))
𝚎𝚡𝚌𝚎𝚙𝚝 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛:
𝚛𝚎𝚝𝚞𝚛𝚗 (𝚒𝚜𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎(𝚡, 𝚜𝚝𝚛), 𝚏𝚕𝚘𝚊𝚝('𝚒𝚗𝚏'))
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2