Come ottimizza il compilatore Python le operazioni di concatenazione di stringhe: in quali casi la dichiarazione `s = s + "next"` porterà a una nuova allocazione di memoria e copia O(N), e in quali casi CPython eseguirà un'ottimizzazione in-place O(1)?