向元组添加新的dict条目但不添加新的列表?

2024-05-18 17:41:51 发布

您现在位置:Python中文网/ 问答频道 /正文

灵感来源于《流畅的Python》中的这个谜语:

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

对于那些不知道的人,它会引起一个错误,但是会改变元组

我不明白两件事:

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

  2. 为什么在字典中插入新条目时不会出错:

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


Tags: name字典错误条目两件事bob元组extend
1条回答
网友
1楼 · 发布于 2024-05-18 17:41:51

这是因为在使用extend和dict时,您在检索对象之后对其本身进行了变异,而不是试图将其赋给元组

t[2] += [5, 6]

实际上相当于

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

这显然是不允许的(这就叫__setitem__引擎盖下)

但是,t[2].extend([5, 6])只获取项(使用__getitem__,这是允许的),一旦它有了对象is,就使用extend。不过,对象仍然是同一个对象-您可能会认为它是没有更改的指针

您的注释中的情况很有趣—同样,它在第一条语句b = t[2]中获取对象,然后已经有了对象,对象本身就发生了变化。您可以看到,这不会导致对元组的__setitem__的任何调用。请参阅dupe链接以获取有关为什么可以对元组元素进行变异的信息

相关问题 更多 >

    热门问题