🧠 Хитрая задача по 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
7%
{1, 2}
40%
True
17%
False
29%
Это невозможная операция
7%
Посмотреть ответ
Каким будет вывод этого кода?
Anonymous Quiz
4%
5 5 6
39%
5 6 7
42%
5 5 6 7 7 7
2%
5 6 7 7 7
12%
Посмотреть ответ
This media is not supported in your browser
VIEW IN TELEGRAM
Что выведет следующий код — и почему?
a = 256
b = 256
print(a is b)
x = 257
y = 257
print(x is y)
❓Ожидаешь True в обоих случаях? Не всё так просто.
📌 В Python целые числа от -5 до 256 кешируются.
То есть a и b указывают на один и тот же объект → a is b → True
Но x и y — это уже разные объекты, потому что 257 не кешируется → x is y → False
⚠️ is сравнивает объекты, а не значения.
Если хочешь сравнить значения — используй ==
💡 Вывод: даже базовые типы могут вести себя неожиданно, если сравнивать их через is.
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет вывод этого кода?
Anonymous Quiz
29%
('we', 'are', 'humans')
13%
(we, are, humans)
8%
('we', 'humans')
22%
'we are humans'
28%
Посмотреть ответ
Forwarded from Python RU
Что дадут эти вызовы функции в консоли?
Anonymous Quiz
14%
0 и 0
11%
Zero Division Error и Zero Division Error
57%
0 и Zero Division Error
8%
Zero Division Error и 0
10%
Посмотреть ответ
Каким будет вывод этого кода?
Anonymous Quiz
53%
[0]
32%
[1]
7%
[1, 0]
5%
[0, 1]
4%
Посмотреть ответ
Please open Telegram to view this post
VIEW IN TELEGRAM
Каким будет вывод этого кода?
Anonymous Quiz
55%
120
3%
Никакого вывода не будет
7%
Ошибка: в модуле math нет метода factorial
29%
Ошибка: нужно было написать print(factorial(5))
6%
Посмотреть ответ
Каким будет вывод этого кода?
Anonymous Quiz
23%
['a', 'b', 'c', 'd']
14%
['abcd']
40%
[['a'], ['b'], ['c'], ['d']]
13%
Ни один вариант не подходит
10%
Посмотреть ответ