web-dev-qa-db-ja.com

namedtuple._replace()は、ドキュメントに記載されているように機能しません

namedtuple._replace()の実装に問題があったため、ドキュメントから直接コードをコピーしました:

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

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

p._replace(x=33)

print p

そして私は得ました:

Point(x=11, y=22)

の代わりに:

Point(x=33, y=22)

ドキュメントに示されているように。

Windows 7でPython 2.6を使用しています。

どうしたの?

44
Peter Stewart

はい、あります。ドキュメントどおりに機能します。

._replacereturns新しい名前付きタプル。オリジナルは変更されないため、次のように記述する必要があります。

p = p._replace(x=33)

詳細は somenamedtuple._replace(kwargs) を参照してください。

97

タプルは不変です。 _replace()は、変更を加えた新しいタプルを返します。

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

namedtuple._replace() は新しいタプルを返します。オリジナルは変更されていません。

それは、その先祖タプルのように、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)

NamedTuple._replaceは、同じタイプで値が変更された新しいNamedTupleを返します。

6
hughdbrown