Задача с классом MyList, на первый взгляд, кажется простой, но в ней скрыт небольшой подвох, связанный с работой метода getitem и поведением индексов. Верно ответили 17% из 29-ми человек. Самым популярным ответом с 49% голосов, оказался подвох с индексами. Давайте разберёмся.

Код задачи: `class MyList: def init(self, data): self.data = data

def getitem(self, index): value = self.data[index] if isinstance(value, list): return MyList(value) return value

def repr(self): return "Something"

lst = MyList([10, [20, 30], 40])

print(lst[0], lst[1], lst[1][1], lst[2][1])

Разбор задачи 1. Создаём класс MyList, принимающий в конструкторе список data и, сохраняющий его во внутренний атрибут self.data. 2. Dunder-метод getitem позволяет обращаться к элементам списка через экземпляры класса MyList. Он делает следующее: - Извлекает элемент по индексу. - Если элемент является списком, он оборачивает его в новый объект MyList. - Если элемент не список, он возвращается как есть. 3. Dunder-метод repr отвечает за строковое представление объекта и всегда возвращает строку "Something".

Далее создадим переменную lst с экземпляром класса MyList, передав ему список [10, [20, 30], 40].

Рассмотрим строку print(lst[0], lst[1], lst[1][1], lst[2][1]): 1. lst[0] — это доступ к первому элементу списка data, который равен 10. Так как это не список, метод возвращает 10. 2. lst[1] — это доступ ко второму элементу, [20, 30]. Этот элемент является списком, поэтому метод getitem возвращает новый экземпляр MyList, оборачивающий этот список. При выводе в print, для этого объекта вызывается метод repr, который возвращает "Something". 3. lst[1][1] — это доступ ко второму элементу списка [20, 30]. Но важно заметить, что lst[1] — это объект MyList. Поэтому вызов lst[1][1] сначала вызовет метод getitem у этого нового объекта, и вернёт 30, так как внутри у него хранится обычный список [20, 30]. 4. lst[2] — это доступ к третьему элементу списка data, который равен 40. Этот элемент — не список, а число. Однако в коде происходит попытка доступа ко второму элементу числа 40 с помощью индекса [1], что приведёт к ошибке, потому что у целого числа нет индексов.

Правильный ответ: 2. TypeError.

Почему возникает TypeError? Проблема кроется в выражении lst[2][1]. В списке [10, [20, 30], 40] третий элемент — это число 40, и попытка выполнить операцию индексирования с ним (доступ к элементу [1]) вызывает TypeError, так как индексы применимы только к коллекциям, но не к числам.

Таким образом, код приведёт к ошибке типа TypeError, что и является правильным ответом на задачу.`

repost

37

input message

напишите коммент

еще контент в этом сообществе

еще контент в этом соообществе

войдите, чтобы увидеть

и подписаться на интересных профи

в приложении больше возможностей

пока в веб-версии есть не всё — мы вовсю работаем над ней

сетка — cоциальная сеть для нетворкинга от hh.ru

пересекайтесь с теми, кто повлияет на ваш профессиональный путь