web-dev-qa-db-fra.com

namedtuple._replace () ne fonctionne pas comme décrit dans la documentation

J'avais du mal à implémenter namedtuple._replace(), j'ai donc copié le code tout de suite de la documentation:

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

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

p._replace(x=33)

print p

et j'ai eu:

Point(x=11, y=22)

au lieu de:

Point(x=33, y=22)

comme le montre le doc.

J'utilise Python 2.6 sur Windows 7

Que se passe-t-il?

44
Peter Stewart

Oui, cela fonctionne exactement comme documenté.

._replace renvoie un nouveau tuple nommé, il ne modifie pas l'original, vous devez donc écrire ceci:

p = p._replace(x=33)

Voir ici: somenamedtuple._replace (kwargs) pour plus d'informations.

97
Lasse V. Karlsen

Un tuple est immuable. _replace() renvoie un nouveau Tuple avec vos modifications:

p = p._replace(x=33)
16
Max Shawabkeh

namedtuple._replace() renvoie un nouveau Tuple; l'original est inchangé.

11

Il me semble que namedtuple est immuable, comme son ancêtre, Tuple.

>>> 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 renvoie un nouveau NamedTuple du même type mais avec des valeurs modifiées.

6
hughdbrown