namedtuple._replace() doesn't work as described in the documentation
Question:
I was having trouble implementing namedtuple._replace()
, so I copied the code right off of the documentation:
Point = namedtuple('Point', 'x,y')
p = Point(x=11, y=22)
p._replace(x=33)
print p
and I got:
Point(x=11, y=22)
instead of:
Point(x=33, y=22)
as is shown in the doc.
I’m using Python 2.6 on Windows 7
What’s going on?
Answers:
namedtuple._replace()
returns a new tuple; the original is unchanged.
A tuple is immutable. _replace()
returns a new tuple with your modifications:
p = p._replace(x=33)
Yes it does, it works exactly as documented.
._replace
returns a new namedtuple, it does not modify the original, so you need to write this:
p = p._replace(x=33)
See here: somenamedtuple._replace(kwargs) for more information.
It looks to me as if namedtuple is immutable, like its forebear, 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
returns a new NamedTuple
of the same type but with values changed.
But YES, you are right: in the ‘official’ documentation, they forgot to assign the replaced tuple to a variable: https://docs.python.org/3/library/collections.html?highlight=collections#collections.namedtuple
p._replace(x=33)
instead of
p1 = p._replace(x33)
I was having trouble implementing namedtuple._replace()
, so I copied the code right off of the documentation:
Point = namedtuple('Point', 'x,y')
p = Point(x=11, y=22)
p._replace(x=33)
print p
and I got:
Point(x=11, y=22)
instead of:
Point(x=33, y=22)
as is shown in the doc.
I’m using Python 2.6 on Windows 7
What’s going on?
namedtuple._replace()
returns a new tuple; the original is unchanged.
A tuple is immutable. _replace()
returns a new tuple with your modifications:
p = p._replace(x=33)
Yes it does, it works exactly as documented.
._replace
returns a new namedtuple, it does not modify the original, so you need to write this:
p = p._replace(x=33)
See here: somenamedtuple._replace(kwargs) for more information.
It looks to me as if namedtuple is immutable, like its forebear, 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
returns a new NamedTuple
of the same type but with values changed.
But YES, you are right: in the ‘official’ documentation, they forgot to assign the replaced tuple to a variable: https://docs.python.org/3/library/collections.html?highlight=collections#collections.namedtuple
p._replace(x=33)
instead of
p1 = p._replace(x33)