Python:namedtuple._replace()不能像文档中描述的那样工作

Pet*_*art 41 python namedtuple

我在实现时遇到了问题namedtuple._replace(),因此我直接从文档中复制了代码:

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

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

p._replace(x=33)

print p
Run Code Online (Sandbox Code Playgroud)

我得到了:

Point(x=11, y=22)
Run Code Online (Sandbox Code Playgroud)

代替:

Point(x=33, y=22)
Run Code Online (Sandbox Code Playgroud)

正如文件中所示.

我在Windows 7上使用Python 2.6

这是怎么回事?

ang*_*son 91

是的,它完全按照记录的方式工作.

._replace 返回一个新的namedtuple,它不会修改原始的,所以你需要写这个:

p = p._replace(x=33)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参见:somenamedtuple._replace(kwargs).

  • 文档中需要注意的一件好事:我对使用下划线前缀的方法持谨慎态度,因为这通常是为了表明[该方法是私有的](https://docs.python.org/3.8/tutorial/classes.html#private -变量)。然而,在这种情况下,这样做是为了避免与“namedtuple”字段(可能包括“replace”字段)发生冲突,因此可以安全使用。有一个“._asdict()”方法,其工作原理类似。 (6认同)

Max*_*keh 16

元组是不可变的._replace()返回一个包含修改的新元组:

p = p._replace(x=33)
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 11

namedtuple._replace()返回一个新的元组; 原件没有变化.

  • 谢谢你们.我希望我能接受所有回复. (2认同)

hug*_*own 6

它看起来好像namedtuple是不可变的,就像它的祖先元组一样.

>>> 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)
Run Code Online (Sandbox Code Playgroud)

NamedTuple._replace返回NamedTuple相同类型的新类,但值已更改.

  • FWIW,方法名称的灵感来自str.replace(),它具有非常相似的使用模式:-)``s ='the quick brown fox'; s = s.replace('quick','slow')`` (4认同)
  • 雷蒙德·海廷格?荣幸. (3认同)