Ответ 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
.