A row of characters
A string is text: characters kept in order. Line 1 stores "café" as four characters, c, a, f and é. Each one has a numbered place, its index, counting from 0, just like a list.
word[0] reads the character at index 0: "c". The last index is 3, one less than the length. Negative indexes count from the end, so word[-1] is "é". Reading never changes the string.
word[1:3] is a slice. It starts at index 1 and stops just before index 3, so it gives "af". The slice is a new string; word still holds "café".
len(word) is 4. It counts characters, and each character is a code point: the number Unicode gives it. Saved as UTF-8, "é" takes two bytes, so a file holds 5 bytes for these 4 characters.
Always a new string
Strings are immutable: once made, they cannot change. word[0] = "C" tries to swap one character, so Python stops with a TypeError and word stays "café". To change text, you build a new string.
word + "s" does not stretch word. Python builds a brand-new string in fresh memory, copies c, a, f and é into it, and adds s: "cafés". The f-string f"{word}s" builds the same new string.
A method is an action a string can do. word.upper() returns a new string, "CAFÉ", and word stays "café". word.find("f") gives the index 2, and "a,b".split(",") cuts text into the list ["a", "b"].
Compare and join
Python compares strings one character at a time, by code point. "café" and "cat" match until index 2, where "f" is 102 and "t" is 116. 102 is smaller, so word < "cat" is True.
Adding pieces with + in a loop builds a whole new string on every pass. join() collects the pieces and builds the result once, which is much faster for long text. "+".join(word) gives "c+a+f+é".
Try it in the Python prompt
;; step 1/9 · line 1: word = "café" >>> word = "café" >>> word 'café' >>> type(word) <class 'str'> >>> list(word) ['c', 'a', 'f', 'é']
The drawing gives each character one box. Inside, CPython stores a whole string as one block using 1, 2 or 4 bytes per code point, chosen by its widest character (PEP 393); "café" fits in 1 byte each. The Python docs warn that building a string by repeated concatenation has a quadratic cost: doubling the text roughly quadruples the work. CPython can sometimes extend a string in place, but code should not rely on it.