Почему строке или числу нельзя изменить значение?
При попытке "изменить" значение у неизменяемого типа, будет создан новый объект, которому будет присвоено новое значение. Т.е. внешне он как бы изменится, но вот "под капотом" будет происходить создание/уничтожение объектов, а не изменение одного и того же объекта (вы же в курсе, что в питоне даже простой int является объектом?). И вот такое поведение следует учитывать, чтобы писать оптимальный код, в котором не будет зазря копироваться и уничтожаться куча объектов.
В виду этого, у строк, скажем, нельзя безболезненно изменять отдельные символы, и приходится делать странные вещи, если символ таки изменить нужно:
Change one character in a string in Python?