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

简介:

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

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

神奇的操作

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

上面这段代码会出现什么样的情况

  1. t会变成(1,2,[30,40,50,60])
  2. 因为tuple不支持对它的元素赋值,所以会抛出TypeError异常
  3. 以上两个都不是
  4. 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雁横

目录
相关文章
|
3月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
296 2
|
3月前
|
开发者 Python
Python列表推导式:优雅与效率的完美结合
Python列表推导式:优雅与效率的完美结合
451 116
|
3月前
|
大数据 开发者 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
395 109
|
3月前
|
Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
476 119
|
3月前
|
开发者 Python
Python列表推导式:优雅与效率的完美融合
Python列表推导式:优雅与效率的完美融合
346 104
|
3月前
|
Python
Python列表推导式:优雅与效率的艺术
Python列表推导式:优雅与效率的艺术
320 99
|
3月前
|
数据处理 Python
解锁Python列表推导式:优雅与效率的完美融合
解锁Python列表推导式:优雅与效率的完美融合
294 99
|
3月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
456 95
|
4月前
|
开发者 Python
Python神技:用列表推导式让你的代码更优雅
Python神技:用列表推导式让你的代码更优雅
514 99
|
4月前
|
程序员 Python
Python列表推导式:简洁与高效的艺术
Python列表推导式:简洁与高效的艺术
311 99

推荐镜像

更多