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

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

>>> [] is []
False

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

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

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

Ответы

Ответ 1

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

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

Из docs в 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.