记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错相关的知识,希望对你有一定的参考价值。

记录一个python里面很神奇的操作

今天记录一个很神奇的操作。关于序列的增量赋值。如果你很熟悉增量赋值,你也不妨看下去,我想说的是有关于增量赋值和元组之间一种神奇的操作。来自 《流畅的Python》 一书,让我们更加深入地了解里面的原理

神奇的操作

>>>t = (1,2,[30,40])
>>>t[2] += [50,60]

上面这段代码会出现什么样的情况
a. t会变成(1,2,[30,40,50,60])
b. 因为tuple不支持对它的元素赋值,所以会抛出TypeError异常
c. 以上两个都不是
d. a和b都是对的
大多数人都会认为b是正确的,本书的作者也是这么认为的,但是实际上呢?却是选 b

不要疑惑,就是这样,既报错,又成功进行了修改

首先讲一下增量赋值

我们使用增量赋值运算符 +=*= 等增量赋值运算符的时候(用 += 举例),使用的是背后的特殊方法 __iadd__,如果没有实现这个方法则会退而求其次,使用 __add__ .

两者的区别是什么?
用列表举例 a+=b,使用 __add__ 的话就像是使用了a.extend(b),如果使用 __add__ 的话,则是 a = a+b,前者是直接在原列表上进行扩展,而后者是先从原列表中取出值,在一个新的列表中进行扩展,然后再将新的列表对象返回给变量,显然后者的消耗要大些。

继续将那个神奇的操作

既然我们了解了变量赋值,那么我们就可以更深入一些了。

t[2] += [50,60] 实现原理:

  1. 将t[2]的值,存入TOS(Top Of Stack 栈的顶端)。
  2. 计算TOS +=b 。这一步可以完成,是因为TOS指向的是一个列表(可变对象)。
  3. t[2] = TOS 赋值。这一步失败,并且报错,因为t是不可变的元组

我们可以通过python tutor这个网站去找到里面运行的详细过程
技术分享图片
技术分享图片

以上是关于记录一个python里面很神奇的操作,对一个包含列表的元组进行增量赋值,成功赋值但还报错的主要内容,如果未能解决你的问题,请参考以下文章

记录一下python列表的神奇之处

用python将几个mysql数据库的数据同步到一个mysql里面

索引操作

索引操作

Python里面的负号的各种神奇用法?来填坑啦

用python操作MySQL,在python界面中显示的数据时被修改过的,但是从MySQL中进入查看表,数据没有被改变