关于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中的+、+=、*、*= 的相关文章

  • 使用 Marshmallow 中的数据更新行 (SQLAlchemy)

    我正在使用 Flask Flask SQLAlchemy Flask Marshmallow marshmallow sqlalchemy 尝试实现 REST api PUT 方法 我还没有找到任何使用 SQLA 和 Marshmallow
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 运行源代码中包含 Unicode 字符的 Python 2.7 代码

    我想运行一个在源代码中包含 unicode utf 8 字符的 Python 源文件 我知道这可以通过添加评论来完成 coding utf 8 在一开始的时候 但是 我希望不使用这种方法来做到这一点 我能想到的一种方法是以转义形式编写 un
  • 如何通过 Python socket.send() 发送字符串以外的任何内容

    我对 Python 编程非常陌生 但出于必要 我必须快速地将一些东西组合在一起 我正在尝试通过 UDP 发送一些数据 除了当我执行 socket send 时 我必须以字符串形式输入数据之外 一切都正常 这是我的程序 这样你就可以看到我在做
  • 打印一个 Jupyter 单元中定义的所有变量

    有没有一种更简单的方法来以漂亮的方式显示单个单元格中定义的所有变量的名称和值 我现在做的方式是这样的 但是当有30个或更多变量时我浪费了很多时间 您可以使用whos http ipython readthedocs io en stable
  • Selenium 网页抓取与动态内容和隐藏数据表上的美丽汤

    真的需要这个社区的帮助 我正在使用 Selenium 和 Beautiful Soup 对 Python 中的动态内容进行网页抓取 问题是定价数据表无法解析为 Python 即使使用以下代码 html browser execute scr
  • 出现意外的关键字参数“timeout”(Python 中的 google-cloud-storage)

    使用 google cloud storage 的 Python 项目在本地运行良好 但是当它从 App Engine 运行时 会显示错误 Traceback most recent call last File opt python3 7
  • 超时时杀死或终止子进程?

    我想尽可能快地重复执行子进程 然而 有时这个过程会花费太长的时间 所以我想杀死它 我使用 signal signal 如下所示 ppid pipeexe pid signal signal signal SIGALRM stop handl
  • 如何在Python中获取绝对文件路径

    给定一条路径 例如 mydir myfile txt 如何在Python中找到文件的绝对路径 例如 在 Windows 上 我最终可能会得到 C example cwd mydir myfile txt gt gt gt import os
  • 如何在Python中正确声明ctype结构+联合?

    我正在制作一个二进制数据解析器 虽然我可以依靠 C 但我想看看是否可以使用 Python 来完成该任务 我对如何实现这一点有一些了解 我当前的实现如下所示 from ctypes import class sHeader Structure
  • 如何在 Numpy 中实现垃圾收集

    我有一个名为main py 它引用另一个文件Optimisers py它仅具有功能并用于for循环进入main py 这些函数都有不同的优化功能 This Optimisers py然后引用另外两个类似的文件 其中也只有函数 它们位于whi
  • 散景中的时间序列流

    我想在散景中绘制实时时间序列 我只想在每次更新时绘制新的数据点 我怎样才能做到这一点 散景网站上有一个动画情节的示例 但它每次都需要重新绘制整个图片 另外 我正在寻找一个简单的示例 我可以在其中逐点绘制时间序列的实时绘图 散景效果0 11
  • if/else 在 while 循环内正确缩进[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我开始学习 Python 编程大约几周了 我遇到了一些麻烦 下面的代码是一个小程序 用于检查列表中是否有偶数 如果找到第一个偶数
  • Python:使用列表创建二叉搜索树

    我的代码的目标是从 txt 文件中获取每个单独的单词并将其放入列表中 然后使用该列表创建二叉搜索树来计算每个单词的频率 并按字母顺序打印每个单词及其频率 中的每个单词只能包含字母 数字 或 我无法用我的初学者编程知识来做的部分是使用我拥有的
  • 通过套接字发送字符串(python)

    我有两个脚本 Server py 和 Client py 我心中有两个目标 能够从客户端一次又一次地向服务器发送数据 能够将数据从服务器发送到客户端 这是我的 Server py import socket serversocket soc
  • 如何在包更新之间保留数据文件?

    我正在使用data files的论证setuptools setup 将配置文件安装到 etc和用户主目录 但是更新包pip install
  • tweepy 流到 sqlite 数据库 - 语法错误[重复]

    这个问题在这里已经有答案了 可能的重复 tweepy 流到 sqlite 数据库 语法无效 https stackoverflow com questions 9434205 tweepy stream to sqlite database
  • 如何在 Pandas 数据框中用 NaN 替换一系列值?

    我有一个巨大的数据框 我应该如何用 NaN 替换一系列值 200 100 数据框 您可以使用pd DataFrame mask https pandas pydata org pandas docs stable generated pan
  • 如何在 Python 中解析损坏的 XML?

    我无法影响的服务器发送的 XML 非常损坏 具体来说 Unicode WHITE STAR 将被编码为 UTF 8 E2 98 86 然后使用 Latin 1 转换为 HTML 实体表 我得到的是 acirc 98 86 9 个字节 位于声
  • 如何获取所有Python标准库模块的列表?

    我想要类似的东西sys builtin module names标准库除外 其他不起作用的事情 sys modules 只显示已经加载的模块 sys prefix 包含非标准库模块并且似乎无法在 virtualenv 内工作的路径 我想要这

随机推荐

  • 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