请考虑以下代码:
>>> 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
进行了突变,即它是一个可变对象。但是它到处都说tuple
和namedtuple
都是不可变的对象。我很困惑。
此外,如果它是一个不可变的对象,为什么它具有_replace
方法?
答案 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)