Когда 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
функция.