2024-05-18 17:41:51 发布
网友
灵感来源于《流畅的Python》中的这个谜语:
t = (1, 2, [3,4]) t[2] += [5, 6]
对于那些不知道的人,它会引起一个错误,但是会改变元组
我不明白两件事:
为什么t[2].extend([5, 6])可以工作,没有任何错误
t[2].extend([5, 6])
为什么在字典中插入新条目时不会出错:
t = (1, {}) t[1]["name"] = "bob"
这是因为在使用extend和dict时,您在检索对象之后对其本身进行了变异,而不是试图将其赋给元组
extend
t[2] += [5, 6]
实际上相当于
t[2] = t[2] + [5, 6]
这显然是不允许的(这就叫__setitem__引擎盖下)
__setitem__
但是,t[2].extend([5, 6])只获取项(使用__getitem__,这是允许的),一旦它有了对象is,就使用extend。不过,对象仍然是同一个对象-您可能会认为它是没有更改的指针
__getitem__
您的注释中的情况很有趣—同样,它在第一条语句b = t[2]中获取对象,然后已经有了对象,对象本身就发生了变化。您可以看到,这不会导致对元组的__setitem__的任何调用。请参阅dupe链接以获取有关为什么可以对元组元素进行变异的信息
b = t[2]
这是因为在使用
extend
和dict时,您在检索对象之后对其本身进行了变异,而不是试图将其赋给元组实际上相当于
这显然是不允许的(这就叫
__setitem__
引擎盖下)但是,
t[2].extend([5, 6])
只获取项(使用__getitem__
,这是允许的),一旦它有了对象is,就使用extend
。不过,对象仍然是同一个对象-您可能会认为它是没有更改的指针您的注释中的情况很有趣—同样,它在第一条语句
b = t[2]
中获取对象,然后已经有了对象,对象本身就发生了变化。您可以看到,这不会导致对元组的__setitem__
的任何调用。请参阅dupe链接以获取有关为什么可以对元组元素进行变异的信息相关问题 更多 >
编程相关推荐