Когда Python создает новые объекты списков для пустых списков?

Следующее имеет смысл для меня:

>>> [] is []
False

Учитывая, что списки изменчивы, я бы ожидал [] быть новым пустым объектом списка каждый раз, когда он появляется в выражении. Однако, используя это объяснение, меня удивляет следующее:

id([]) == id([])
True

Зачем? Какое объяснение?

1 ответ

Решение

В первом примере [] не является [] именно потому, что списки изменчивы. Если бы они не были, они могли бы безопасно отобразить тот же без проблем.

Во втором примере id([]) создает список, получает идентификатор и освобождает список. Во второй раз он снова создает список, но "помещает его в то же место", потому что больше ничего не произошло. id действителен только при жизни объекта, и в этом случае его время жизни практически равно нулю

Из документов по id:

Это целое число (или длинное целое число), которое гарантированно будет уникальным и постоянным для этого объекта в течение срока его службы. Два объекта с неперекрывающимися временами жизни могут иметь одинаковое значение id().


Прокомментировал разборку:

   0 LOAD_GLOBAL              0 (id)    # load the id function
   3 BUILD_LIST               0         # create the first list
   6 CALL_FUNCTION            1         # get the id
   9 LOAD_GLOBAL              0 (id)    # load the id function
  12 BUILD_LIST               0         # create the second list
  15 CALL_FUNCTION            1         # get the id
  18 COMPARE_OP               2 (==)    # compare the two ids
  21 RETURN_VALUE                       # return the comparison

Заметки нет STORE_FAST сохранить список. Поэтому он был удален сразу после передачи в id функция.

Другие вопросы по тегам