这很可能是重复的内容,但我的搜索功能无法找到。
众所周知,元组是不可变的,因此您实际上无法更改它们。然而,有时候,做一些类似于将 (1, 2, "three")
更改为 (1, 2, 3)
的事情会很方便,也许与 Haskell 记录更新语法 类似。您实际上不会更改原始元组,但是您将得到一个在仅一个(或多个)元素上有所不同的新元组。
一种实现方法是:
elements = list(old_tuple)
elements[-1] = do_things_to(elements[-1])
new_tuple = tuple(elements)
我认为将元组转换为列表有点违背了使用元组类型的初衷:old_tuple
。如果您使用列表,每次操作都不必在内存中构建一个丢弃的列表副本。
如果您只想更改元组的第三个元素,也可以这样做:
def update_third_element(a, b, c, *others):
c = do_things_to(c)
return tuple(a, b, c, *others)
new_tuple = update_third_element(*old_tuple)
这种方法比朴素的方法更能抵抗元组中元素数量的变化:
a, b, c, d, e, f, g, h, i, j = old_tuple
c = do_things_to(c)
new_tuple = (a, b, c, d, e, f, g, h, j, j) # whoops
...但如果你想要更改的是最后一个或倒数第n个元素,则此方法无效。它还会创建一个临时列表(others
)。它还强制你命名前n个元素。
有更好的方法吗?
str
,它们拥有一个replace
方法,尽管是不可变的。 - badp