更新元组中的列表

波罗的海的太阳

我只是在翻译中玩弄,碰到了我不理解的东西。当我创建一个以列表作为元素的元组,然后尝试更新该列表时,会发生一些奇怪的事情。例如,当我运行此命令时:

tup = (1,2,3,[4,5])
tup[3] += [6]

我得到:

TypeError: 'tuple' object does not support item assignment

这正是我所期望的。但是,当我再次引用元组时,我得到:

>>> tup
(1, 2, 3, [4, 5, 6])

因此,即使python抛出异常,该列表实际上也已更新。这是如何运作的?我无法想象实际上我想做这样的事情,但是我仍然想了解发生了什么。谢谢。

卡琳

这实际上记录在Python文档中

编辑:这是一个摘要,以便这是一个更完整的答案。

  1. 当使用时+=,Python会__iadd__在商品上调用magic方法,然后在后续的商品分配中使用返回值。
  2. 对于列表,__iadd__等效于调用extend列表然后返回列表。
  3. 因此,当我们调用时tup[3] += [6],它等效于:

    result = tup[3].__iadd__([6])
    tup[3] = result
    
  4. 从#2,我们可以确定这等效于:

    result = tup[3].extend([6])
    tup[3] = result
    
  5. 第一行成功调用extend列表,并且由于列表是可变的,因此它会更新。但是,随后的分配失败,因为元组是不可变的,并引发错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章