Почему этот код печатает True

Почему этот код печатает True

@python_quiz

Разберем этот квиз

Короткий фрагмент кода:

python

В этой статье разберём, как работают min с ключом, проверка идентичности через is и почему результат именно такой.

Разбор по шагам

  1. min(users, key=...)

- Функция min итерируется по элементам списка users.
- Для каждого элемента вычисляется значение ключа: здесь lambda u: len(u['logins']).
- Выбирается элемент с минимальным значением ключа.
- Если несколько элементов имеют одинаковое минимальное значение, min вернёт первый из них по порядку.

  1. Оператор is

- is проверяет идентичность объектов (то есть ссылаются ли две переменные на один и тот же объект в памяти).
- Это не то же самое, что == (сравнение по значению).

  1. В нашем списке

- users[0]['logins'] — пустой список (len = 0).
- users[1]['logins'] — список с одним элементом (len = 1).
- Минимум по длине логинов — первый элемент списка users[0].
- min возвращает сам объект users[0] (не копию).
- Поэтому сравнение с пользователем из списка через is даёт True.

Демонстрация: что реально происходит

Запустим тот же код и пару вариаций:

python

Вариант с одинаковыми длинами (tie-breaker):

python

Вариант с внешним, но равным по содержимому объектом:

python

Анализ других возможных исходов (кратко)

  • False: мог бы появиться, если бы min вернул другой объект (например, если элемент с минимальным ключом — не users[0]). В текущих данных это не так.
  • TypeError: не случится, потому что len применяется к спискам, а key-функция корректна для всех элементов.
  • ValueError: не возникнет, min бросает ValueError только при пустой последовательности; здесь список не пуст.

Выводы

  • min при передаче key возвращает сам элемент из итерируемого объекта (по ссылке), не копию.
  • Оператор is проверяет именно идентичность объектов, поэтому сравнение с users[0] вернёт True, когда min вернёт тот же объект.
  • При равных значениях ключа min возвращает первый встретившийся минимальный элемент.

Report Page