关于python中的+、+=、*、*=

2023-10-29

不废话,直接干货

1.了解一下python的内存机制

a=1
b=1
id(a)=id(b)    #短的字符串,数字python在内存中是一个对象
         
a=[]
b=[]
id(a)!=id(b)      #字典,数组这样的对象在内存中python会创建两个不同的对象
   
a="new a string"
b="new a string"   
id(a)!=id(b)       #长的字符串python在内存中同样会创建两个不同的对象

2.python中万物皆对象(很简单的一句话,也是最核心的一句话)

# 不可变类型
>>>a = 'wangjunjie'
>>>id(a)
4324743920
>>>a += '0817'
>>>id(a)
4324744944
>>>a = a + '0817'
>>>id(a)
4324750584
# 可变类型
>>>my_list = [1, 2, 3]
>>>my_list
[1, 2, 3]
>>>id(my_list)
4324743240
>>>my_list += [4, 5, 6]
>>>my_list
[1, 2, 3, 4, 5, 6]
>>>id(my_list)
4324743240
>>>my_list = my_list + [7, 8, 9]
>>>my_list
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>id(my_list)
4324744136

简单总结上面显示结果的几个重要结论:
1.变量分为不可变类型和可变类型,字符串、元组、整型、浮点型等数字都是不可比那类型,字典、列表、集合是可变类型
2.对于不可变类型,无论是执行a = a+b还是a += b,a的内存地址都会变,可以理解为生成了新的变量;
那对于可变类型,执行my_list = my_list + new_list时,my_list的内存地址发生变化,即my_list变成了一个新的变量;但是在执行my_list += new_list的时候,my_list内存地址不会发生变化,即没有生成新的变量,这种方法效果等类似于列表的extend操作。

**这里有一个例外的类型,小伙伴们要重视,那就是str,str是有__iadd__方法的,只不过不像列表一样地址ID不变,str的地址是会变的

3.两种方法的python底层原理

从方法的背后魔法方法可以清楚的解释这种现象:
+=背后的魔法方法是__iadd__
+背后的魔法方法是__add__
如果一个类,没有实现__iadd__方法的话,python就会退一步调用__add__方法
总体来说,可变类型都有__iadd__方法,而不可变类型没有__iadd__方法
为了方便记忆,我自己是这么记的:=单独出现的作用一般是赋值操作,所以a = a + b实际上就是python帮我们算出来a + b的值之后赋值给了变量a,在python眼中,这两个a本身就是两个毫无关联的对象。

4.举个栗子更好的理解这个问题

>>>my_tuple = (1, 2, [3, 4])
>>>my_tuple[2] += [5, 6]

思考一下此时my_tuple的值

>>> my_tuple = (1, 2, [3, 4])
>>> my_tuple[2] += [5, 6]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> my_tuple
(1, 2, [3, 4, 5, 6])
>>> 

猜对了吗?实际上,这里面有两个点,第一个是元组不可变,python确实报错了,但是my_tuple中的列表呢?第二个是实际上元组中的列表只是一个列表对象内存地址的引用而已,所以在执行my_tuple[2] += [5, 6]时候,列表的值被改变了!

注意一下:以上这个报错用my_tuple[2].extend([5, 6])不会报错,这并不违背元组是不可变的原则,因为引用地址确实没变,只不过地址里面的值,已经发生变化了!

5.* 和 *=

其实,这两个和+、+= 基本一样,只不过背后的魔法方法是__imul__和__mul__而已,就这么简单~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于python中的+、+=、*、*= 的相关文章

随机推荐

  • IDEA实现远程调试步骤详解

    IDEA不仅可以本地调试代码 也可以远程调试代码 一 基本原理 本机和远程主机的两个 VM 之间使用 Debug 协议通过 Socket 通信 传递调试指令和调试信息 被调试程序的远程虚拟机 作为 Debug 服务端 监听 Debug 调试
  • 【Mo 人工智能技术博客】时序预测模型——LSTNet

    时序预测模型 LSTNet 作者 陈东瑞 1 背景 多元时间序列数据在我们的日常生活中无处不在 从股票市场的价格 高速公路上的交通流量 太阳能发电厂的输出量 不同城市的温度等等 在这样的应用中 用户通常对基于时间序列的历史观察来对新趋势或潜
  • 人脸识别技术的成熟让刷脸支付落地

    按照识别的精度排序 确实是虹膜 指纹 人脸的识别精度依次降低 但人脸识别可以根据摄像头的提升而提升 双目摄像头 结构光摄像头 TOF等等 这个上升空间很大 从应用性来看 你现在让所有的用户都去提取虹膜信息 指纹信息 这个很难 不现实 而我们
  • 文件复制到u盘后文件夹是空的,怎么恢复?

    便携式存储设备有很多种 其中就有u盘 由于这个给予我们生活工作中极大的便利 相信不少小伙伴都喜欢随身携带一个 但不少人遇到过明明已经把文件存放到u盘里了 在正常打开的情况下 再次使用时 出现u盘文件夹是空白的 碰到这样的情况 文件复制到u盘
  • 量化指标公式源码_精选指标:通达信公式无敌紫金钻选股指标——附源码

    精选指标 通达信公式无敌紫金钻选股指标 附源码 精选指标 通达信公式无敌紫金钻选股指标 附源码 VAR1 CLOSE MA CLOSE 21 MA CLOSE 21 100 VAR2 CLOSE LLV LOW 43 HHV HIGH 43
  • 第10章 K8s进阶篇-高级调度计划任务,污点和容忍和Affinity

    10 1 什么是Job job常用作初始化数据和基本的创建操作 job创建成功后不会立即执行容器命令 只有suspend true 才会执行 10 2 Job使用入门 root k8s master01 10st cat job yaml
  • HTML实现简单登录以及界面跳转

  • 经典上中(左右)下三栏布局

    经典上中 左右 下三栏布局 利用绝对定位实现三栏布局 1 html div class container div class top 我是顶部 div div class content div class div div div
  • 构建用户画像-标签体系

    用户画像是目前在技术公司广泛使用的技术 是根据客户人口统计信息 社交关系 偏好习惯和消费行为等信息而抽象出来的标签化画像 常常用在精准营销 圈定人群 发送短信消息 APP弹窗等等 用户画像的准确性往往会直接影响到运营的效果和获客成本 用户画
  • Qt Widgets 之 QDockWidget(停靠窗口)

    目录 什么是停靠窗口 如何添加停靠窗口 QDockWidget setWidget QMainWindow addDockWidget 设置停靠选项 Options AnimatedDocks AllowNestedDocks AllowT
  • Keil在线调试程序乱跑

    最近改了一个别人写的程序 但是在调试器调试过程中出现了一个奇怪的现象 代码部分如下 Sys Run这个函数在main函数中被无限循环调用 初始化时我会将TCENABLE这个标志位置0 通过CAN发送信息来改变他的数值 按道理来说当我运行程序
  • gcc -O0 -O1 -O2 -O3 四级优化选项及每级分别做什么优化

    相关博客http blog chinaunix net uid 24954950 id 2956476 html 相关博客http blog csdn net misiter article details 7514428 相关博客http
  • linux top命令看到的实存(RES)与虚存(VIRT)分析

    近期在公司中解决程序使用的内存高问题 将一部分之前无法回收的内存进行了回收 实现降内存效果 降实存 在统计效果时 QA问是统计RES 实存 还是VIRT 虚存 在网上学习看了一些博客 这里自己总结一下RES和VIRT的区别 1 概念 VIR
  • 绘制同y轴双侧柱状图,且y轴位置在坐标为0的位置,左右x轴均为正值(Python)

    绘制同y轴双侧柱状图 且y轴位置在坐标为0的位置 左右x轴均为正值 Python 在数据可视化中 柱状图是一种常用的图表类型 用于展示不同类别或变量之间的比较 本文将介绍如何使用Python绘制一个同y轴双侧柱状图 且y轴的位置在坐标为0的
  • JQuery之ContextMenu(右键菜单)

    插件下载地址 http www trendskitchens co nz jquery contextmenu jquery contextmenu r2 js 压缩版 http www trendskitchens co nz jquer
  • java_分数

    题目内容 设计一个表示分数的类Fraction 这个类用两个int类型的变量分别表示分子和分母 这个类的构造函数是 Fraction int a int b 构造一个a b的分数 这个类要提供以下的功能 double toDouble 将分
  • BFS(广度优先搜索)简单例题(一)

    bfs想必非常的熟悉了 bfs大多数用来解决什么问题呢 一个最直观经典的例子就是走迷宫 我们从起点开始 找出到终点的最短路程 很多最短路径算法就是基于广度优先的思想成立的 所以这篇博客 主要是利用bfs找迷宫的最短距离 首先看看bfs一般的
  • 【安卓逆向】分析某人直播.apk登录组包

    安卓逆向交流QQ群692903341 1 打开 人人 apk 进入登陆页面 输入用户名和密码 并用fiddler软件抓包 fiddler抓包如下图所示 红框所示为登录时向服务器发达的包 下面我们要分析这里面每个字段的产生 2 打开ddms
  • 记本地Debug测试遇见异步处理操作数据库遇见的问题

    1 打断点本地测试异步处理 在异步处理子线程里操作数据库报数据库连接池已关闭错误 这里使用 SpringBoot 自带的数据库连接池 HikariDataSource 为例 Caused by org springframework jdb
  • 关于python中的+、+=、*、*=

    不废话 直接干货 1 了解一下python的内存机制 a 1 b 1 id a id b 短的字符串 数字python在内存中是一个对象 a b id a id b 字典 数组这样的对象在内存中python会创建两个不同的对象 a new