首页 > 解决方案 > 如果命名元组是不可变的,为什么它有一个 _replace 方法?

问题描述

请考虑以下代码:

>>> point = namedtuple('point', ('x', 'y'))
>>> p1 = point(3,4)
point(x=3, y=4)
>>> id(p1)
2881782633456  # address in memory

>>> p1._replace(x = 78)
point(x=78, y=4)
>>> id(p1)
2881782633456  # same as before. 

好像我namedtuple在原地发生了变异,即它是一个可变对象。但是它到处都说tuples 和namedtuples 都是不可变的对象。我很困惑。

此外,如果它是一个不可变的对象,为什么它有一个_replace方法?

标签: pythonnamedtuple

解决方案


Tuple绝对是不可变的。如果您打印 p1,即使在_replace功能之后也是如此。

>>> point = namedtuple('point', ('x', 'y'))
>>> p1 = point(3,4)
>>> p1
point(x=3, y=4)   #same before _replace
>>> p1._replace(x = 78)
point(x=78, y=4)
>>> p1
point(x=3, y=4)  #same after _replace

那你为什么有_replace? 它旨在返回命名元组的新实例,用新值替换指定字段。它不会改变实际的元组本身。手术是短暂的。


推荐阅读