python - 如果命名元组是不可变的,为什么它有一个 _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
在原地发生了变异,即它是一个可变对象。但是它到处都说tuple
s 和namedtuple
s 都是不可变的对象。我很困惑。
此外,如果它是一个不可变的对象,为什么它有一个_replace
方法?
解决方案
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? 它旨在返回命名元组的新实例,用新值替换指定字段。它不会改变实际的元组本身。手术是短暂的。
推荐阅读
- python - Python ValueError:使用 df.loc 插入值列表
- android - 即使我们只使用只读方式,我是否必须在 4 月 27 日之前更新 Google Fitness SDK v20?
- amazon-web-services - EC2 免费层 7 天后达到 85% 的使用率
- c++ - 什么是 void `std::allocator`?即:`std::allocator
` - sql - Spring JPA 在表中查找 max() 主键值
- java - java.lang.NoClassDefFoundError:无法初始化类 java.time.zone.ZoneRulesProvider
- json - 在编辑表格视图单元格时,单元格没有编辑新单元格,为什么要在表格视图中添加?迅速
- javascript - 我在我的项目中得到 f.getClientRects 不是函数错误我在布局中使用 juqery.min.js 文件 2 次用于不同目的
- javascript - 在 background.js 中的 Chrome 扩展中的 setInterval
- cucumber - 空手道 - Cucumber 报告 - 每次运行构建时如何让 cucumber 生成唯一的 .html 报告文件