2012-06-10 20 views
5

¿Un objeto inmutable en python significa que su valor no se puede cambiar después de su concepción? Si ese es el caso, lo que sucederá cuando intentemos cambiar su valor.¿Qué le sucede a un objeto inmutable en python cuando se cambia su valor?

Déjame intentar explicar mi duda con un ejemplo.

Por ejemplo, he inicializado un objeto String S con el valor "Hello World".

S = 'Hello World' 

Entonces me escribió en la línea,

S = 'Hello Human' 

Así que cuando le pido al intérprete, que me dice que el valor de S es "Hello Human". Claramente ahora 'S' tiene un nuevo valor.

¿Cómo cambió el valor? ¿Python destruyó el viejo objeto de cadena y creó uno nuevo con el nuevo valor? o simplemente cambió el valor del objeto viejo. ¿Tiene esto algo que ver con el hecho de que el objeto de cadena es inmutable? Si es así, ¿cómo se comportan los objetos mutables?

Respuesta

8

Python detuvo S que apunta a la edad del objeto de cadena e hizo que apunte a una nueva

>>> S="Hello World" 
>>> id(S) 
32386960 
>>> S="Hello Human" 
>>> id(S) 
32387008 
>>> 

No se puede cambiar objetos inmutables, por lo que incluso cuando se piensa que ser muight (por ejemplo, con la += operador) no está

>>> S="Hello" 
>>> id(S) 
32386912 
>>> S+=" World" 
>>> id(S) 
32386960 
>>> 
+0

Cuidado al usar palabra "destruir" alrededor de cadenas literales. –

+0

Eso es un detalle de implementación y (en su mayoría) invisible para el usuario, pero el punto tomado - ha cambiado la redacción en la publicación. –

+1

Su respuesta me dio una idea, gracias –

4

El valor no ha cambiado. El nombre era atado a un nuevo objeto.

2
s = 'helloworld' 
>>> id(s) 
29779592 
>>> s = 'hello' 
>>> id(s) 
29771680 

Ahora la variable S se refieren al nuevo objeto

4

Así que si estás haciendo algo como esto:

>>> s = "Hello World" 
>>> print s 
"Hello World" 
>>> old_s = s 
>>> s = "Hello Human" 
>>> print s 
"Hello Human" 
>>> print old_s 
"Hello World" 

Se puede ver que las cadenas en Python no son mutables (literalmente - no se puede mutar ellos).

Al agregar a una cadena (u otros objetos inmutables, como tuplas o enteros), se crea una nueva copia del objeto y se borra la referencia a la anterior. (Python maneja la recolección de basura por ti, cuando ya nada hace referencia al objeto).

0

Las variables en python no son más que enlaces, por lo que cuando usas el operador de asignación estás creando un nuevo enlace o reemplazando un anterior dependiendo de la versión de python que estés usando ... Pero creo que esto es implementación detalles de los que no tiene que preocuparse.

objetos mutables como diccionarios/listas pueden cambiar su estado interno a través de diversos métodos, ya sea interna o externa, objetos inmutables no tienen tales métodos, su estado sólo se puede ajustar durante la construcción y los objetos mismos sólo puede ser destruido, a menos se agrupan por razones de rendimiento ...

1

¿Un objeto inmutable en python significa que su valor no se puede cambiar después de su concepción?

Sí.

Si ese es el caso, qué sucederá cuando intentemos cambiar su valor.

La pregunta no es válida, porque nunca intenta cambiar su valor, porque no hay medios disponibles para cambiar la prueba.

Lo que realmente está preguntando es qué sucede cuando asignamos una variable que nombra el valor.

Quiero que tome nota especial de la palabra "a" allí: más de una variable puede nombrar el mismo valor. También quiero que tomes especial no de la palabra "nombres": las variables de Python son de hecho nombres, no almacenan valores, pero les dan nombres.

Claramente, ahora 'S' tiene un nuevo valor.

ahora Snombres un valor diferente.

¿Cómo cambió el valor?

No lo hizo. S dejó de nombrar lo que solía nombrar, y comenzó a nombrar un nuevo valor.

quiso pitón destruir el viejo objeto de cadena

Se puede tener, si no hay otros nombres para él. Si no hay nombres para un valor, se destruirá con el tiempo. Esa no es tu preocupación como programador.

y crearon uno nuevo con el nuevo valor?

Sí.

Si es así, ¿cómo se comportan los objetos mutables?

De la misma manera, cuando asigne el nombre. Los nombres son nombres, y los valores son valores. (En este contexto, "objeto" y "valor" significan lo mismo.) La asignación es el proceso de hacer que un nombre nombre un valor. No importa si el objeto es mutable o no. La mutación se realiza de otras maneras. (Aunque podría argumentar que, por ejemplo, un list es realmente una lista de nombres, y realmente no cambia la lista, sino que cambia la cantidad de nombres y sus referentes.)

+0

Esta es mi idea de una lista. Una lista contiene una colección ordenada de valores. El nombre de la lista está vinculado a todos estos valores. Es a través de valores de mutación que se agregan, anexan y eliminan en una lista. Por favor, corríjame si estoy equivocado. –

Cuestiones relacionadas