【问题标题】:Addition of new dict entry to tuple working but not new list? [duplicate]将新的字典条目添加到元组工作但不是新列表? [复制]
【发布时间】:2018-01-30 01:21:44
【问题描述】:

灵感来自“Fluent Python”中的这个谜题:

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

对于那些不知道的人,它会引发错误,但会改变元组。

我不明白两件事:

  1. 为什么t[2].extend([5, 6]) 可以正常工作,没有任何错误?

  2. 为什么向字典中插入新条目可以正常工作:

    t = (1, {}) t[1]["name"] = "bob"

【问题讨论】:

标签: python tuples


【解决方案1】:

这是因为使用 extend 和 dict 您在检索对象后会自行改变对象,而不是尝试分配给元组。

t[2] += [5, 6]

实际上有点等价于

t[2] = t[2] + [5, 6]

这显然是不允许的。 (这在后台调用__setitem__

但是,t[2].extend([5, 6]) 仅获取项目(使用 __getitem__,这是允许的),一旦获得对象,则使用 extend。但该对象仍然是同一个对象 - 您可能会将其视为未更改的指针。

您评论中的案例是一个有趣的案例 - 再次,它在第一个语句 b = t[2] 中获取对象,然后已经拥有该对象会改变对象本身。您可以看到这不会导致对元组的__setitem__ 进行任何调用。有关为什么可以改变元组元素的信息,请参阅 dupe 链接。

【讨论】:

  • 但是当我在做b = t[2] 然后b += [5, 6] 时,它也在改变元组。
  • 这就是我错过的setitem
猜你喜欢
  • 2020-05-04
  • 2016-08-14
  • 2017-12-09
  • 2022-09-24
  • 2023-04-02
  • 2020-05-21
  • 2018-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多