В Python строки являются неизменяемыми объектами и иногда для оптимизации Python использует один и тот же объект для хранения идентичных строковых литералов
Но это не гарантировано для строк, созданных динамически или через операции, как в данном примере с конкатенацией
Оператор
is проверяет идентичность объектов, а не их эквивалентность. А так как z и "123456" — это разные объекты в памяти, даже если их значения одинаковы, то и ответ у нас False