The surprise comes with a cost, and the cost is in bugs.  The point of Python 3 is to eliminate some bugs in Python 2, and forcing developers to redesign their code around a completely new string API--no matter if that new API is more semantically sound--will come with its own cost of introduced bugs and more painful conversions, which goes against the purpose of Python 3.<p>I&#x27;m not saying that the string API in Python is perfection, but it had a specific role to fill in the larger Python ecosystem, and it does that very well.<p>Anyway... I would say that len(x) == 0 <i>should be</i> the same as saying that x is empty.  According to the Unicode standard, the number of grapheme clusters in &quot;\u0301&quot; is 1, anyway!  And on most systems, the string will display as an acute accent in its own space, and you can place the cursor before or after it.<p>Not like the set of valid &quot;cursor positions&quot; in a string isn&#x27;t a locale-dependent value, anyway.  Grapheme clusters can be thought of to be locale-independent but they are NOT the same as cursor positions.