You&#x27;re right that O(1) access is pointless, and UTF-8 is fine.  But there are space optimizations on the Python string object which make it so it doesn&#x27;t waste that much space.  Basically, it dynamically selects LATIN-1, UCS-2, or UTF-32 (or you could call them UCS-1, UCS-2, UCS-4, but there isn&#x27;t really any such thing as UCS-1, and UCS-4 is an obsolete name for UTF-32).<p><pre><code>    &gt;&gt;&gt; import sys
    &gt;&gt;&gt; def charsize(x):
    ...     return sys.getsizeof(x + x) - sys.getsizeof(x)
    ...
    &gt;&gt;&gt; charsize(b&#x27;A&#x27;)
    1
    &gt;&gt;&gt; charsize(&#x27;A&#x27;)
    1
    &gt;&gt;&gt; charsize(&#x27;\xff&#x27;)
    1
    &gt;&gt;&gt; charsize(&#x27;\uffff&#x27;)
    2
    &gt;&gt;&gt; charsize(&#x27;\U0010FFFF&#x27;)
    4</code></pre>