Why strings are immutable
Once created, a string's bytes cannot change. This lets Python cache the length and hash, making strings fast as dict keys and safe to share. Every operation you think of as 'editing' actually allocates a new string:
s = "cat"
s = s + "dog" # new object, old 'cat' may be garbage collected
For building many pieces, accumulate in a list and call ''.join() once, repeated + on large strings is O(n²).
Slicing semantics
The slice s[start:stop:step] always omits stop. If start is omitted it defaults to the beginning; if stop is omitted it defaults to the end. A negative step reverses:
word = "racecar"
print(word[::-1]) # 'racecar' reversed
Out-of-range indices never raise, slicing is forgiving, unlike single-index access which raises IndexError.