usar una separar reemplazar por funcion eliminar contar concatenar comparar como caracteres caracter cadenas cadena python compilation internals object-identity

una - Concatenación de cadenas en Python



python separar string por caracter (2)

Aquí hay un pequeño ejercicio:

>>> def f1(): ''hello'' >>> def f2(): ''hel'' ''lo'' >>> def f3(): ''hel'' + ''lo'' >>> def f4(): ''hel%s'' % ''lo'' >>> def f5(): ''hel%s'' % (''lo'',) >>> for f in (f1, f2, f3, f4, f5): print(f.__name__) dis.dis(f) f1 1 0 LOAD_CONST 1 (None) 3 RETURN_VALUE f2 1 0 LOAD_CONST 1 (None) 3 RETURN_VALUE f3 2 0 LOAD_CONST 3 (''hello'') 3 POP_TOP 4 LOAD_CONST 0 (None) 7 RETURN_VALUE f4 2 0 LOAD_CONST 3 (''hello'') 3 POP_TOP 4 LOAD_CONST 0 (None) 7 RETURN_VALUE f5 2 0 LOAD_CONST 1 (''hel%s'') 3 LOAD_CONST 3 ((''lo'',)) 6 BINARY_MODULO 7 POP_TOP 8 LOAD_CONST 0 (None) 11 RETURN_VALUE

Como puede ver, el compilador realiza todas las concatenaciones / formateos simples. La última función requiere un formateo más complejo y, por lo tanto, supongo que realmente se ejecuta. Dado que todos los objetos creados en el tiempo de compilación tienen todos el mismo ID.

¿Puede describir la diferencia entre dos formas de concatenación de cadenas: simple __add__ operador y %s patrones? Investigué algo en esta pregunta y encontré %s (en forma sin usar paréntesis) un poco más rápido.

También apareció otra pregunta: ¿por qué el resultado de ''hell%s'' % ''o'' refiere a otra región de memoria que ''hell%s'' % (''o'',) ?

Hay algún ejemplo de código:

l = [''hello'', ''hell'' + ''o'', ''hell%s'' % ''o'', ''hell%s'' % (''o'',)] print [id(s) for s in l]

Resultado:

[34375618400, 34375618400, 34375618400, 34375626256]

PD: sé sobre el interinato de cuerdas :)


Usar % es, técnicamente hablando, formateo de cadenas, no concatenación. Son dos mundos completamente * diferentes.

Si sabe sobre el interinato de cuerdas, debe saber que no hay absolutamente ninguna garantía de que dos cadenas ocupen la misma memoria que otra. El hecho de que en tu ejemplo los primeros tres lo hagan no es más que pura coincidencia.

No estoy 100% seguro de cómo funciona el formateo de cadenas, pero sé que no está implementado de la misma manera en el C subyacente que la concatenación, creo que funciona un poco más a lo largo de las líneas de ''''.join(sequence) , que también es más rápido que + para cadenas grandes: consulta esta publicación para obtener más información.

* tipo de