namedtuple._replace() doesn't work as described in the documentation

Solution 1:

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.

Solution 2:

A tuple is immutable. _replace() returns a new tuple with your modifications:

p = p._replace(x=33)

Solution 3:

namedtuple._replace() returns a new tuple; the original is unchanged.