ну так-то он работает. смотри: когда ты пишешь x *=x интерпритатор ищет эту переменную сначало в локальной зоне видимости. Переменная x в твоей функции выступает как аргумент, то есть он ищет значение аргумента, а ты при вызове его не обозначил , НО зато объявил глобальные переменные с теми же именами , как и у аргументов. То есть , как я уже написал - конфликт имен. Смотри что будет , если поменять названия глобальных переменных вне функции: То есть всё работает, как тебе и надо. Но смотри, аргументы не задействуются, поэтому они не нужны. то есть если тебе надо работать с переменными , то задавай их , если с аргументами функции, то задавай их тоже , обозначай при вызове, но не называй их названиями переменных