灵感来自这个谜语"流利的Python":
t = (1, 2, [3,4])
t[2] += [5, 6]
对于那些不知道的人,它会引发错误,但会改变元组。
我不理解两件事:
为什么t[2].extend([5, 6])
会有效,没有任何错误?
为什么在字典中插入新条目时没有任何错误:
t = (1, {})
t[1]["name"] = "bob"
答案 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__
的任何调用。有关为何可以改变元组元素的信息,请参阅欺骗链接。