我在实现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。
发生了什么事情?
我在实现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。
发生了什么事情?
是的,它确实如文档所述正常工作。
._replace
返回一个新的namedtuple,它不会修改原始对象,因此你需要编写以下代码:
p = p._replace(x=33)
请查看此处:somenamedtuple._replace(kwargs) 以获取更多信息。
namedtuple
的字段发生冲突(其中可能包括名为replace
的内容),因此可以放心使用。还有一个类似的._asdict()
方法。 - Chris Vandevelde元组是不可变的。 _replace()
返回一个新元组,其中包含您所做的修改:
p = p._replace(x=33)
在我看来,namedtuple 就像其前辈 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)
< p > NamedTuple._replace
返回一个新的NamedTuple
,与原来的类型相同,但值已更改。
s='the quick brown fox'; s=s.replace('quick', 'slow')
- Raymond Hettinger但是,没错,你说得对:在“官方”文档中,他们忘记将替换的元组分配给变量:https://docs.python.org/3/library/collections.html?highlight=collections#collections.namedtuple
p._replace(x=33)
替代
p1 = p._replace(x33)
p._replace(x=33)
时,它会将新元组输出到屏幕。他们没有遗漏任何内容,这是完全正常的交互使用。下一行显示了一个更复杂的代码片段,其中返回值被分配给某个东西。 - joanis