在元组工作中添加新的dict条目但不是新列表?

时间:2017-08-21 21:52:01

标签: python tuples

灵感来自这个谜语"流利的Python":

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

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

我不理解两件事:

  1. 为什么t[2].extend([5, 6])会有效,没有任何错误?

  2. 为什么在字典中插入新条目时没有任何错误:

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

1 个答案:

答案 0 :(得分: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__的任何调用。有关为何可以改变元组元素的信息,请参阅欺骗链接。