2010-01-30 7 views
26

que estaba teniendo problemas para implementar namedtuple._replace(), así que copiar el código justo al lado de la documentación:Python: namedtuple._replace() no funciona como descrbed en la documentación

Point = namedtuple('Point', 'x,y') 

p = Point(x=11, y=22) 

p._replace(x=33) 

print p 

y tengo:

Point(x=11, y=22) 

en lugar de:

Point(x=33, y=22) 

como se muestra en el doc.

estoy usando Python 2.6 en Windows 7

¿Qué está pasando?

+6

Esto funciona de la misma manera que str.replace(). Ambas cadenas y tuplas con nombre son inmutables, por lo que sus métodos de reemplazo producen * valores * nuevos sin modificar el valor anterior. La solución a su problema es guardar el nuevo resultado en una variable. –

+0

Una gran pregunta, si no fuera por el simple hecho de que todo el mundo que quiera "modificar" una tilde nombrada va a tropezar con esto en algún momento. – mbarkhau

Respuesta

68

Sí lo hace, funciona exactamente como se documenta.

._replacevuelve un nuevo namedtuple, no modifica el original, por lo que necesita para escribir esto:

p = p._replace(x=33) 

Ver aquí: somenamedtuple._replace(kwargs) para más información.

9

namedtuple._replace() devuelve una nueva tupla; el original no ha cambiado

+1

Gracias a todos. Ojalá pudiera aceptar todas las respuestas. –

12

Una tupla es inmutable. _replace() devuelve una nueva tupla con sus modificaciones:

p = p._replace(x=33) 
6

Me parece que si namedtuple es inmutable, como su antepasado, tupla.

>>> from collections import namedtuple 
>>> Point = namedtuple('Point', 'x,y') 
>>> 
>>> p = Point(x=11, y=22) 
>>> 
>>> p._replace(x=33) 
Point(x=33, y=22) 
>>> print(p) 
Point(x=11, y=22) 
>>> p = p._replace(x=33) 
>>> print(p) 
Point(x=33, y=22) 

NamedTuple._replace devuelve una nueva NamedTuple del mismo tipo pero con valores modificados.

+4

FWIW, el nombre del método fue inspirado por str.replace() que tiene un patrón de uso notablemente similar :-) '' s = 'el zorro marrón rápido'; s = s.replace ('rápido', 'lento') '' –

+3

¿Raymond Hettinger? Honrado. – hughdbrown

Cuestiones relacionadas