如果namedtuple是不可变的,为什么它具有_replace方法?

时间:2019-01-06 09:07:20

标签: python namedtuple

请考虑以下代码:

>>> 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进行了突变,即它是一个可变对象。但是它到处都说tuplenamedtuple都是不可变的对象。我很困惑。

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

3 个答案:

答案 0 :(得分:2)

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? 它旨在返回一个命名元组的新实例,用新值替换指定字段。它不会改变实际的元组本身。该手术是短暂的。

答案 1 :(得分:1)

由于您没有将其分配回来,因此请替换此行:

void print(int x)
{
    printf("%d\n", !(~( x + !(x + 1) ^ (x + 1))));
}
int main() {
        print (2147483647);
        print(2147483646);
        print(-1);
        print(-2147483648);
}

使用:

p1._replace(x = 78)

要与众不同。

答案 2 :(得分:1)

_replace方法创建一个新的namedtuple,它不会使原始元组发生变异,因此保留了不变性。

来自docs

  

返回命名元组的新实例,用新值替换指定字段