<分区>
这极有可能是某物的副本,但我的 serach foo 使我失望了。
众所周知,元组是不可变的,因此您无法真正更改它们。然而,有时,将 (1, 2, "three")
更改为 (1, 2, 3)
的效果会派上用场,也许与 Haskell record update syntax. 类似您实际上不会更改原始元组,但您会得到一个新元组,它只有一个(或多个)元素不同。
执行此操作的一种方法是:
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 个。
有没有更好的办法?