🧠 Хитрая задача по Python — что не так с set и списками?
Задача:
Вы хотите получить уникальные элементы из вложенных списков:
Что произойдёт?
Варианты ответа:
1. Выведется:
2. Выведется:
3. Произойдёт ошибка
4. Все вложенные списки преобразуются в кортежи и выведутся без дубликатов
Правильный ответ:
💥
🔍 Разбор
В Python элементы
То есть:
✅ Как сделать правильно?
Если вы хотите получить уникальные вложенные списки, можно преобразовать их в кортежи:
А если хочется вернуть результат обратно в список списков:
⚠️ Вывод
-
- Используйте
- Уникальность вложенных списков — частый источник багов при работе с JSON, DataFrame, API
📌 Такие мелочи легко упустить, но они выстреливают в самых неожиданных местах. Подписывайся, чтобы не наступать на грабли в одиночку.
Задача:
Вы хотите получить уникальные элементы из вложенных списков:
items = [[1, 2], [3, 4], [1, 2]]
unique = set(items)
print(unique)
Что произойдёт?
Варианты ответа:
1. Выведется:
{[1, 2], [3, 4]}
2. Выведется:
[[1, 2], [3, 4]]
3. Произойдёт ошибка
4. Все вложенные списки преобразуются в кортежи и выведутся без дубликатов
Правильный ответ:
3. Произойдёт ошибка
💥
TypeError: unhashable type: 'list'
🔍 Разбор
В Python элементы
set
должны быть хешируемыми. А списки — изменяемый тип данных, следовательно, не хешируемы.То есть:
set([[1, 2], [3, 4]])
# ❌ вызовет ошибку
✅ Как сделать правильно?
Если вы хотите получить уникальные вложенные списки, можно преобразовать их в кортежи:
items = [[1, 2], [3, 4], [1, 2]]
unique = set(tuple(x) for x in items)
print(unique) # {(1, 2), (3, 4)}
А если хочется вернуть результат обратно в список списков:
result = [list(x) for x in unique]
print(result) # [[1, 2], [3, 4]] (порядок не гарантирован)
⚠️ Вывод
-
list
нельзя положить в set
, dict
как ключ — они unhashable- Используйте
tuple
для таких случаев- Уникальность вложенных списков — частый источник багов при работе с JSON, DataFrame, API
📌 Такие мелочи легко упустить, но они выстреливают в самых неожиданных местах. Подписывайся, чтобы не наступать на грабли в одиночку.
Forwarded from Python/ django
def append_to_list(val, my_list=[]):
my_list.append(val)
return my_list
print(append_to_list(1))
print(append_to_list(2))
print(append_to_list(3))
🤯 Подвох
Многие думают, что каждый вызов append_to_list() создаёт новый список, и ожидают вывод:
[1]
[2]
[3]
Но на самом деле Python выведет:
[1]
[1, 2]
[1, 2, 3]
🧠 Почему так происходит?
В Python значения аргументов по умолчанию вычисляются один раз — при определении функции, а не при каждом вызове.
Значение my_list=[] создаётся один раз и сохраняется между вызовами. Это работает как статическая переменная внутри функции.
✅ Как это исправить?
Используй None как значение по умолчанию:
def append_to_list(val, my_list=None):
if my_list is None:
my_list = []
my_list.append(val)
return my_list
print(append_to_list(1)) # [1]
print(append_to_list(2)) # [2]
print(append_to_list(3)) # [3]
💡 Вывод
Не используйте изменяемые объекты (например, list, dict, set) как значения по умолчанию для аргументов функций в Python.
@pythonl
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет вывод этого кода в консоли?
Anonymous Quiz
8%
{1, 2}
39%
True
17%
False
27%
Это невозможная операция
9%
Посмотреть ответ
Каким будет вывод этого кода?
Anonymous Quiz
3%
5 5 6
38%
5 6 7
40%
5 5 6 7 7 7
3%
5 6 7 7 7
16%
Посмотреть ответ