9.1 Introduction to Strings
What a string is, why it's the universal interface between a program and the outside world, how it's represented in memory, and why immutability is the property everything else in this chapter builds on.
Everything in this chapter builds on one fact: a string never changes after it’s created.
What Is a String?
What Is It?
A string is an ordered, immutable sequence of Unicode characters — Python’s built-in type for representing text. Anything that is “text” in a Python program, from a single letter to an entire log file’s contents, is stored as a str object.
>>> s = "DevOps"
>>> type(s)
<class 'str'>
>>> len(s)
6
Why Does It Matter?
Strings are the universal interface between a program and the outside world — every system boundary (files, networks, users, other programs) communicates in text. Every filename, URL, config value, and piece of user input passes through str, and string-handling correctness (encoding, escaping, formatting) is a common source of production bugs.
Real-World Uses of Strings
- Parsing configuration files (JSON, YAML, INI)
- Processing application and server logs
- Building and validating URLs, emails, and file paths
- Constructing SQL/NoSQL queries and API request bodies
- Templating reports, emails, and generated code
Strings in DevOps and AWS
In DevOps and cloud engineering specifically, strings are the interface: CloudWatch logs, Terraform output, kubectl output, ARNs, and CI/CD console logs are all just text that scripts must parse reliably — the focus of 9.12 Strings in DevOps and AWS later in this chapter.
Memory Representation of Strings
Every Python string is a heap-allocated object (PyUnicodeObject in CPython) carrying a reference count, type pointer, cached hash, and a character buffer. A variable holding a string is just a reference to this object — assignment copies a pointer, never the characters themselves (see 6.3 Memory Management: Stack vs Heap).
CPython also interns many literal, identifier-like strings, so equal literals can share a single object:
>>> a = "hello"; b = "hello"
>>> a is b
True # same interned object -- not guaranteed for runtime-built strings
String Immutability
A string can never be changed in place. Every method that appears to modify a string (replace(), upper(), strip(), …) returns a brand-new object; the original is untouched — the same rule covered generally in 5.9 Mutable vs Immutable Types.
>>> s = "hello"
>>> s.upper()
'HELLO'
>>> s # unchanged
'hello'
Advantages and Limitations
| Advantages | Limitations |
|---|---|
| Safe to share across functions/threads (no aliasing bugs) | Every “modification” allocates a new object |
| Usable as dict keys / set members (hashable) | Looping with += is O(n²) for large strings — see 9.11 Memory and Performance |
| Interning saves memory for repeated literals | Fixed per-object overhead beyond raw characters |
| Rich standard-library method set | Wide Unicode strings use more memory per character |
Quick Interview Answer
“A string is an ordered, immutable sequence of Unicode characters — Python’s built-in type for text. Immutability is the defining property: no method ever changes a string in place, every apparent modification returns a brand-new object, and that’s exactly what makes strings safe to share across functions and threads and usable as dict keys. Under the hood, every string is a heap-allocated
PyUnicodeObject, and CPython interns many literal strings so identical literals can share one object — though that’s an implementation detail, not something to rely on for correctness.”
Common Mistakes
- Assuming
s.replace(...)ors.upper()mutatessin place — it returns a new string; the call is useless unless the result is captured or reassigned. - Comparing strings with
isinstead of==because interning happened to make a small test case pass — interning isn’t guaranteed for every string, especially ones built at runtime. - Treating a string as mutable “because it looks like a list of characters” — indexing works, but
s[0] = "x"raisesTypeError.
Add More Questions to This Guide
Know a question that should be here? Share it and help the community!
Open Google Form