2012-03-09 26 views
16

Aunque sé que existe la posibilidad de:Python Eliminar El último carácter de la cadena y devolverlo

>>> a = "abc" 
>>> result = a[-1] 
>>> a = a[:-1] 

Ahora también sé que las cadenas son inmutables y por lo tanto algo como esto:

>>> a.pop() 
c 

es imposible.

¿Pero esta es realmente la forma preferida?

+0

Intenté agregar , no sé por qué no funcionó. –

+2

Realmente depende de lo que estés tratando de hacer y lo importante que es optimizar el código. Creo que en la mayoría de los casos solo se prefiere devolver una nueva cadena, en lugar de crear otro tipo o usar una lista. – dave

+0

Si tiene que hacer esto con frecuencia, vuelva a pensar su algoritmo. – delnan

Respuesta

27

Las cadenas son "inmutables" por una buena razón: realmente ahorra muchos dolores de cabeza, más a menudo de lo que piensas. También permite que python sea muy inteligente para optimizar su uso. Si desea procesar la cadena en incrementos, se puede sacar parte de ella con split() o separarlo en dos partes utilizando índices:

a = "abc" 
a, result = a[:-1], a[-1] 

Esto demuestra que estás dividiendo la cadena en dos.Si vas a estar examinando cada byte de la cadena, se puede iterar sobre ella (a la inversa, si lo desea):

for result in reversed(a): 
    ... 

Debo añadir esto parece un poco artificial: Su cadena es más probable que tenga alguna separador, y luego vamos a usar split:

ans = "foo,blah,etc." 
for a in ans.split(","): 
    ... 
5

No solo es la forma preferida, es la única manera razonable. Dado que las cadenas son inmutables, para "eliminar" un carácter de una cadena, debe crear una nueva cadena siempre que desee un valor de cadena diferente.

Quizás se esté preguntando por qué las cadenas son inmutables, dado que tiene que crear una cadena completamente nueva cada vez que cambia un carácter. Después de todo, las cadenas C son solo matrices de caracteres y, por lo tanto, son mutables, y algunos lenguajes que admiten cadenas más limpiamente que C también permiten cadenas mutables. Hay dos razones para tener cadenas inmutables: seguridad/seguridad y rendimiento.

La seguridad es probablemente la razón más importante para que las cadenas sean inmutables. Cuando las cadenas son inmutables, no puede pasar una cadena a una biblioteca y luego hacer que esa cadena cambie debajo de sus pies cuando no lo espera. Puede preguntarse qué biblioteca cambiaría los parámetros de cadena, pero si envía código a los clientes no puede controlar sus versiones de la biblioteca estándar, y los clientes malintencionados pueden cambiar sus bibliotecas estándar para romper su programa y obtener más información. acerca de sus partes internas. Los objetos inmutables también son más fáciles de razonar, lo cual es realmente importante cuando intenta probar que su sistema está protegido contra amenazas particulares. Esta facilidad de razonamiento es especialmente importante para la seguridad del hilo, ya que los objetos inmutables son automáticamente seguros para la rosca.

El rendimiento sorprendentemente a menudo es mejor para cadenas inmutables. Cada vez que toma una porción de una cadena, el tiempo de ejecución de Python solo coloca una vista sobre la cadena original, por lo que no hay una nueva asignación de cadena. Como las cadenas son inmutables, obtienes semántica de copia sin copiar en realidad, lo que es una ganancia de rendimiento real.

Eric Lippert explica más sobre la lógica detrás de inmutable de cadenas (en C#, no en Python) here.

1

Sí, las cadenas de Python son inmutables y cualquier modificación dará como resultado la creación de una nueva cadena. Así es como está hecho en su mayoría.

Entonces, adelante.

3

el texto exacto de la pregunta me hace pensar que es imposible.

return para mí significa que tiene una función, que ha pasado una cadena como parámetro.

No puede cambiar este parámetro. Asignarlo solo cambiará el valor del parámetro dentro de la función, no la cadena pasada. P.ej.

>>> def removeAndReturnLastCharacter(a): 
     c = a[-1] 
     a = a[:-1] 
     return c 

>>> b = "Hello, Gaukler!" 
>>> removeAndReturnLastCharacter(b) 
! 

>>> b # b has not been changed 
Hello, Gaukler! 
Cuestiones relacionadas