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

开发者社区> 雁横> 正文

记录一个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雁横

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Django框架介绍与安装
软件框架就是为实现或完成某种软件开发时,提供了一些基础的软件产品, 框架的功能类似于基础设施,提供并实现最为基础的软件架构和体系 通常情况下我们依据框架来实现更为复杂的业务程序开发 二个字,框架就是程序的骨架
4 0
总结与回顾| 学习笔记
快速学习总结与回顾
4 0
python垃圾回收
吃太多,总会变胖,Python也是这样。当Python中的对象越来越多,它们将占据越来越大的内存。不过你不用太担心Python的体形,它会乖巧的在适当的时候“减肥”,启动垃圾回收(garbage collection),将没用的对象清除。在许多语言中都有垃圾回收机制,比如Java。尽管最终目的都是塑造苗条的提醒,但不同语言的减肥方案有很大的差异 。
4 0
从零到一上手玩转云服务器心得
本期活动主要是学习云服务器的各种操作,简单配置并搭建各种博客等实例
10 0
总结与回顾(1)| 学习笔记
快速学习总结与回顾(1)
3 0
云计算大数据及人工智能| 学习笔记
快速学习云计算大数据及人工智能
4 0
CentOS搭建单体FastDFS
CentOS搭建单体FastDFS
4 0
Windows下JDK安装与配置(超详细,图文详解、适合小白查看)
Windows下JDK安装与配置(超详细,图文详解、适合小白查看)
10 0
Windows下JDK安装与配置(超详细,图文详解、适合小白查看)
Windows下JDK安装与配置(超详细,图文详解、适合小白查看)
8 0
初始ECS
物联网学习的硬性需求,我们需要搭建一台自己的服务器,在不断查找资料和方法后,获知阿里云ECS云服务器有学生体验资格,继而我将利用ECS云服务器搭建一个自己的EMQX服务器端。
17 0
+关注
雁横
分享好玩的编程给大家,提供一种趣味学习的方式
30
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载