Здесь перед нами так называемая одна из распространённых «ловушек» в Python. Связана она с изменяемыми значениями по умолчанию для аргументов функции
Когда мы определяем функцию func(x=[]), значение по умолчанию для x — это пустой список []
Однако этот список создаётся один раз при определении функции и затем «запоминается» между вызовами функции. Это означает, что если мы изменим этот список внутри функции (как это делается с помощью x.append(1)), эти изменения также сохранятся между вызовами
По итогу сначала будет выведено [1], а затем [1, 1]
Изначально x и y указывают на один и тот же список в памяти — [1, 2, 3]
Затем, когда мы приравниваем x = [4, 5, 6], мы изменяем ссылку для переменной x, чтобы она указывала на новый список [4, 5, 6]. Однако y продолжает указывать на оригинальный список [1, 2, 3]
В итоге, когда мы выводим значение y, оно остается [1, 2, 3]