2010-01-30 13 views
26

ich Probleme namedtuple._replace() aufweisen, wurde die Umsetzung, so kopierte ich den Code direkt aus der Dokumentation:Python: namedtuple._replace() funktioniert nicht wie descrbed in der Dokumentation

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

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

p._replace(x=33) 

print p 

und ich bekam:

Point(x=11, y=22) 

statt:

Point(x=33, y=22) 

wie im Dokument angezeigt wird.

Ich verwende Python 2.6 auf Windows 7

Was ist los?

+6

Dies funktioniert genauso wie str.replace(). Sowohl Strings als auch benannte Tupel sind unveränderlich, daher erzeugen ihre Ersetzungsmethoden * neue * Werte, während der alte Wert unverändert bleibt. Die Lösung für Ihr Problem besteht darin, das neue Ergebnis in einer Variablen zu speichern. –

+0

Große Frage, wenn aus irgendeinem anderen Grund jeder, der ein Nametuple "modifizieren" will, irgendwann darüber stolpern wird. – mbarkhau

Antwort

68

Ja, es funktioniert, es funktioniert genau so, wie dokumentiert.

._replacekehrt ein neues namedtuple, es ändert nicht das Original, so dass Sie diese schreiben müssen:

p = p._replace(x=33) 

Siehe hier: somenamedtuple._replace(kwargs) für weitere Informationen.

9

namedtuple._replace() gibt ein neues Tupel zurück; das Original ist unverändert.

+1

Danke euch allen. Ich wünschte, ich könnte alle Antworten akzeptieren. –

12

Ein Tupel ist unveränderlich. _replace() gibt ein neues Tupel mit Ihren Änderungen:

p = p._replace(x=33) 
6

Es sieht für mich so aus, als wäre namedtuple unveränderlich, wie sein Vorgänger, Tupel.

>>> 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 gibt einen neuen NamedTuple des gleichen Typs, aber mit Werten geändert.

+4

FWIW, der Methodenname wurde von str.replace() inspiriert, das ein bemerkenswert ähnliches Nutzungsmuster hat :-) '' s = 'der schnelle braune Fuchs'; s = s.replace ('schnell', 'langsam') '' –

+3

DER Raymond Hettinger? Geehrt. – hughdbrown

Verwandte Themen