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

目录
相关文章
|
索引
探索QTableWidget对单元格(QWidget/QTableWidgetItem)的内存管理[clearContents()]
1.clearContents() 会清除表格中的所有单元格内容,包括释放之前创建的QTableWidgetItem和通过 setCellWidget() 设置的 QWidget 对象,但是不指向nullptr并且是延时释放QWidget 的而QTableWidgetItem 立即释放; 2.使用 setItem 方法将一个 QTableWidgetItem 对象设置为表格中的一个单元格后,该对象的位置(即所在行的索引)不会改变。这意味着,如果之后将该对象设置为其他单元格,它的位置将保持不变; 3.而使用 setCellWidget 方法将一个QWidget对象设置单元格时,位置可能会改变
886 0
探索QTableWidget对单元格(QWidget/QTableWidgetItem)的内存管理[clearContents()]
|
数据挖掘 Linux 数据处理
Linux命令shuf详解:随机排序与数据分析的得力助手
`shuf`是Linux的命令行工具,用于随机排序和抽样数据。它能对文件或标准输入进行随机处理,适用于数据测试、播放列表和样本选择。主要参数包括:-e处理命令行输入,-i指定数字范围,-n选择行数,-o输出到文件,-r允许重复,-z用NULL分隔。结合其他命令使用能增强其功能。注意输出重定向和随机性的保证。是数据分析的有力助手。
|
存储 缓存 监控
|
数据采集 运维 监控
分布式统一监控系统架构图与设计思路
一、问题解答 二、分布式统一系统 三、统一监控系统架构图 四、设计思路
分布式统一监控系统架构图与设计思路
|
网络协议 Java 关系型数据库
|
分布式数据库 C++ 编译器
使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP注意事项
使用代码手工生成dmp文件 SetUnhandledExceptionFilter 为每个线程设置SetUnhandledExceptionFilter(MyCallBack),(必须在每个线程中启动时调用一次,否则造成无法进入回调函数中)这样该线程中发现未处理的 SEH 异常时就会进入到MyCallBack 回调中.
1418 0
|
10月前
|
SQL Java 数据库连接
MyBatis常见工具解析
MyBatis是一款优秀的Java持久层框架,具备灵活的SQL定制能力和高效的ORM映射机制。其核心工具链涵盖SQL执行、对象操作、代理生成、代码生成与SQL构建,全面提升数据库开发效率。本文从五大维度深入解析常用工具及其技术实现,助你掌握MyBatis高效开发的核心利器。
397 1
|
设计模式 Java 开发者
工厂设计模式的实现与应用场景分析
工厂设计模式的实现与应用场景分析
|
SQL 前端开发
一篇文章讲明白IPage使用大概
一篇文章讲明白IPage使用大概
447 0