🧠 Хитрая задача по 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}
      
    39%
    True
      
    17%
    False
      
    30%
    Это невозможная операция
      
    7%
    Посмотреть ответ
      
    Каким будет вывод этого кода?
  Anonymous Quiz
    5%
    5 5 6
      
    38%
    5 6 7
      
    41%
    5 5 6 7 7 7
      
    2%
    5 6 7 7 7
      
    13%
    Посмотреть ответ
      
    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
    31%
    ('we', 'are', 'humans')
      
    14%
    (we, are, humans)
      
    7%
    ('we', 'humans')
      
    21%
    'we are humans'
      
    26%
    Посмотреть ответ
      
    Forwarded from Python RU
Что дадут эти вызовы функции в консоли?
  Anonymous Quiz
    14%
    0 и 0
      
    12%
    Zero Division Error и Zero Division Error
      
    57%
    0 и Zero Division Error
      
    7%
    Zero Division Error и 0
      
    10%
    Посмотреть ответ
      
    Каким будет вывод этого кода?
  Anonymous Quiz
    53%
    [0]
      
    33%
    [1]
      
    7%
    [1, 0]
      
    4%
    [0, 1]
      
    4%
    Посмотреть ответ
      
    Please open Telegram to view this post
    VIEW IN TELEGRAM
  Каким будет вывод этого кода?
  Anonymous Quiz
    59%
    120
      
    3%
    Никакого вывода не будет
      
    6%
    Ошибка: в модуле math нет метода factorial
      
    26%
    Ошибка: нужно было написать print(factorial(5))
      
    6%
    Посмотреть ответ
      
    Каким будет вывод этого кода?
  Anonymous Quiz
    22%
    ['a', 'b', 'c', 'd']
      
    15%
    ['abcd']
      
    42%
    [['a'], ['b'], ['c'], ['d']]
      
    10%
    Ни один вариант не подходит
      
    10%
    Посмотреть ответ
      
    Please open Telegram to view this post
    VIEW IN TELEGRAM