思考分析Python运算中 a+=b 和 a=a+b是否相等

目录
  • 如题,先上代码
    • a+=b
    • a=a+b
    • a不等于b
    • + 操作调用__add__方法

如题,先上代码

a+=b

>>> b = </code><code>[</code><code>0, 1, 2</code><code>]</code>
<code>>>> a = b
>>> a += [3]
>>> b
[0, 1, 2, 3]
>>> a
[0, 1, 2, 3]

此时a和b的结果是一样的

再看

a=a+b

>>> b = [0, 1, 2]

>>> a = b
>>> a = a + [3]
>>> b
[0, 1, 2]
>>> a
[0, 1, 2, 3]

a不等于b

显然,两者是有区别的,而且这种区别只出现在可变对象(为什么是可变对象后面再说),是什么原因造成了两者的区别呢?

+= 操作调用的是 __iadd__方法,如果对象没有该方法时,再尝试去调用__add__方法

a = [0, 1, 2]
a += [3]
# 等价于
a=a.__iadd__([3])
print(a) #[0, 1, 2, 3]

__iadd__方法直接在原对象a上进行更新,对于list来说,iadd返回self,最后是需要做一次看上去多余的赋值,因为python编译器在编译的时候并不知道a是什么类型,统一编译成这样兼容可变和不可变类型。

+ 操作调用__add__方法

a = [0, 1, 2]
a += [3]
# 等价于
a=a.__iadd__([3])
print(a) #[0, 1, 2, 3]

__add__方法会返回一个新的对象,原对象不修改,因为这里 a被重新赋值了,a指向了一个新的对象,而b还是指向原来对象,所以出现了文章开头a不等于b的情况

a = [0, 1, 2]
print(a.__add__([3]))  # [0, 1, 2, 3]
print(a)  # [0, 1, 2]

为什么前面我说这种差异只会发生的可变对象身上?因为对于不可变对象,根本没有 __iadd__方法,所以+=和+的效果是一样的,调的都是 __add__ 方法。

内置对象中,常见的不可变对象和可变对象有哪些呢?这种事情ChatGPT很擅长回答。

ChatGPT除了给你列出表格,还会给你解释什么是可变对象和不可变对象

可变对象是指创建后可以被修改的对象,例如列表、字典和集合等,这些对象可以增加、删除、修改其中的元素。而不可变对象则是创建后不能被修改的对象,例如数字、字符串、元组和布尔值等,这些对象在创建后不能被修改。

需要注意的是,Python 中的一些不可变对象,例如元组和命名元组,可以包含可变对象,例如列表和字典。这意味着虽然元组本身是不可变的,但是元组中包含的可变对象可以被修改。此外,Python 中还有一些特殊的对象,例如 frozenset,它是一种不可变的集合,不能被修改。

ChaGPT绝对算是一个不折不扣的辅助编程神器

AI不会让你失业,会用AI的人才会让你失业,ChatGPT不会淘汰你,能先驾驭ChatGPT的人会淘汰你。

以上就是Python运算中 a+=b 和 a=a+b是否一样原理的思考分析详细内容,更多关于Python 运算的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python图像运算之图像锐化和边缘检测

    目录 一.图像锐化 1.一阶微分算子 2.二阶微分算子 二.Roberts算子 三.Prewitt算子 四.总结 一.图像锐化 由于收集图像数据的器件或传输图像的通道存在一些质量缺陷,或者受其他外界因素的影响,使得图像存在模糊和有噪声的情况,从而影响到图像识别工作的开展.一般来说,图像的能量主要集中在其低频部分,噪声所在的频段主要在高频段,同时图像边缘信息主要集中在其高频部分.这将导致原始图像在平滑处理之后,图像边缘和图像轮廓模糊的情况出现.为了减少这类不利效果的影响,就需要利用图像锐化技术,使

  • python中dot函数运算过程总结

    目录 基本简介 1. 向量内积 2. 矩阵乘法运算 2.1如下单个数的dot函数运算所示: 2.2如下一维数组的dot函数运算所示: 2.3如下二维数组的dot函数运算所示: 2.4如下二维数组与三维数组的dot函数运算: 2.5如下多维数组的dot函数运算所示: 总结 本文结合其他博主的一些介绍总结了dot函数运算过程 基本简介 dot函数为numpy库下的一个函数,主要用于矩阵的乘法运算,其中包括:向量内积.多维矩阵乘法和矩阵与向量的乘法. 1. 向量内积 向量其实是一维的矩阵,两个向量进行

  • Python中如何实现真正的按位取反运算

    目录 运算代码 实例说明 补充:Python的按位取反运算符的简单解析 总结 文章面向对象:对原理和编程不大有兴趣,只是需要用python实现一些运算功能的非计算机学生或从业者.大佬慎看防止血压拉高 运算代码 x=~x&0xFF num是一个不大于255的十进制正数(负数的我不需要,所以我也没研究) 计算结果也是十进制的数 &右边的0xFF会决定计算结果的比特位.如果要得到正确的计算结果,两边的数据比特位应该相同 例如1000对应的十六进制是0xFC17,16比特位的,这时候求反就应该改成

  • Python运算符之Inplace运算符的使用教程

    Python 在其定义中提供了执行就地操作的方法,即使用“ operator ”模块在单个语句中进行赋值和计算. 例如, x += y is equivalent to x = operator.iadd(x, y) 一些重要的就地操作: 1. iadd()  :- 该函数用于分配和添加当前值.该操作执行“ a+=b ”操作.在不可变容器(例如字符串.数字和元组)的情况下不执行分配. 2. iconcat()  :- 该函数用于在第二个末尾连接一个字符串 . # 演示 iadd() 和 icon

  • Python运算符优先级详细整理

    目录 前言 优先级概述 相同优先级 结合性 运算符优先级一览表 运算符优先级重点说明 结语 前言 虽然本文讲的是Python,但其实它也适用于所有的编程语言.因为这里面蕴含着编程之魂.所以本文标题没有显著的使用Python关键词.当然以前的文章用了Python关键词是因为当时我并没有想到这一点,很多内容也适用所有编程语言. 本文是运算符相关教程的最后一篇,将介绍运算符的最后一个汇总性的概念——运算符的优先级. 优先级概述 所谓优先级,是指优先计算的顺序.比如小学中我们学过的加减乘除基本四则运算,

  • python矩阵的基本运算及各种操作

    目录 一.Python 矩阵基本运算 二.python矩阵乘法 三.python矩阵转置 四.python求方阵的迹 五.python求逆矩阵/伴随矩阵 六.python方阵的行列式计算方法 七.python解多元一次方程 附:矩阵的高级操作 总结 一.Python 矩阵基本运算 引入 numpy 库 import numpy as np 1. python矩阵操作 1)使用 mat 函数创建一个 2X3矩阵 a = np.mat([[1, 2, 3], [4, 5, 6]]) 2)使用 sha

  • Python编程中的反模式实例分析

    本文实例讲述了Python编程中的反模式.分享给大家供大家参考.具体分析如下: Python是时下最热门的编程语言之一了.简洁而富有表达力的语法,两三行代码往往就能解决十来行C代码才能解决的问题:丰富的标准库和第三方库,大大节约了开发时间,使它成为那些对性能没有严苛要求的开发任务的首选:强大而活跃的社区,齐全的文档,也使很多编程的初学者选择了它作为自己的第一门编程语言.甚至有国外的报道称,Python已经成为了美国顶尖大学里最受欢迎的编程入门教学语言. 要学好一门编程语言实属不易,在初学阶段,就

  • python实现的批量分析xml标签中各个类别个数功能示例

    本文实例讲述了python实现的批量分析xml标签中各个类别个数功能.分享给大家供大家参考,具体如下: 文章目录 需要个脚本分析下各个目标的数目 顺带练习下多进程,自用,直接上代码: # -*- coding: utf-8 -*- # @Time : 2019/06/10 18:56 # @Author : TuanZhangSama import os import xml.etree.ElementTree as ET from multiprocessing import Pool,fre

  • Python灰度变换中位图切割分析实现

    目录 1. 介绍 2. 实现方法 3. code 4. 比特平面重建图像 1. 介绍 图像的像素值是由比特组成的.例如一副256级灰度图像中,图像是由8 bit组成. 与之前对比度拉伸的区别是,之前我们主要强调在某一范围的灰度值作为我们能感兴趣的目标将其变亮或者变暗.而位图切割主要强调每个bit对图像的贡献,通过方法将不同位的灰度值值取出来还原成图像. 如图所示,一副8 bit图像,我们可以将图像分割成8个,将每个图像对应的比特位取出构建成一副新的图像 2. 实现方法 例如图像某一点的像素值为1

  • Python灰度变换中的对数变换专项分析实现

    目录 1. 原理 2. 代码 1. 原理 对数变换的公式为: 其中:c是伸缩系数,常设为1.src为输入的原图像,dst为经过对数变换的输出图像 对数变换的曲线为: 由曲线的形状可以发现,对数变换将输入中范围较窄的低灰度值映射为输出中灰度值较宽的部分.也就是对数变换可以提升原图中暗区的对比度,同时可以压缩明亮区的对比度. 反对数变换的效果刚好相反 2. 代码 import numpy as np import cv2 def log(x): y =np.log(1+x) ym = y- y.mi

  • Python灰度变换中的分段线性函数专项分析实现

    目录 1. 分段线性函数介绍 2. 代码实现 3. other 1. 分段线性函数介绍 分段线性函数同样是点运算,基于像素的图像增强,也就是对比度拉伸. 大概的原理就是:将不同灰度区间的灰度值经过不同的映射函数映射到另一个灰度区间的过程. 因为使用变换函数的个数是三个,所以我们经常使用的分段线性函数是三段线性变换函数 对应的数学公式为 a = 1 ,b = 0 时,恒等函数,不改变图像的灰度值 a >1, 对比度增强 0 < a < 1 , 对比度减弱 b 控制图像的亮度,b >

  • python开发中range()函数用法实例分析

    本文实例讲述了python开发中range()函数用法.分享给大家供大家参考,具体如下: python中的range()函数的功能很强大,所以我觉得很有必要和大家分享一下 就好像其API中所描述的: If you do need to iterate over a sequence of numbers, the built-in function range() comes in handy. It generates arithmetic progressions 下面是我做的demo: #

  • python开发中module模块用法实例分析

    本文实例讲述了python开发中module模块用法.分享给大家供大家参考,具体如下: 在python中,我们可以把一些功能模块化,就有一点类似于java中,把一些功能相关或者相同的代码放到一起,这样我们需要用的时候,就可以直接调用了 这样做的好处: 1,只要写好了一个功能模块,就可以在以后调用,代码的重用就可以体现出来了 2,功能写好了以后,不会发生错误.如果一个相同的功能,我们在一个模块中写了一遍,在另外的模块中又写了一遍......这样我们难免保证我们在写的过程中不发生错误. 但是我们如果

  • python pandas中索引函数loc和iloc的区别分析

    目录 前言 1.直接使用行或者列标签 2.loc函数 3.iloc函数 总结 前言 使用pandas进行数据分析的时候,我们经常需要对DataFrame的行或者列进行索引.使用pandas进行索引的方法主要有三种:直接使用行或者列标签.loc函数和iloc函数. 举个简单的例子: import numpy as np import pandas as pd df = pd.DataFrame({"Fruits":["apple","pear",&

  • Python算法中的时间复杂度问题

    在实现算法的时候,通常会从两方面考虑算法的复杂度,即时间复杂度和空间复杂度.顾名思义,时间复杂度用于度量算法的计算工作量,空间复杂度用于度量算法占用的内存空间. 本文将从时间复杂度的概念出发,结合实际代码示例分析算法的时间复杂度. 渐进时间复杂度 时间复杂度是算法运算所消耗的时间,因为不同大小的输入数据,算法处理所要消耗的时间是不同的,因此评估一个算运行时间是比较困难的,所以通常关注的是时间频度,即算法运行计算操作的次数,记为T(n),其中n称为问题的规模. 同样,因为n是一个变量,n发生变化时

  • 使用pycallgraph分析python代码函数调用流程以及框架解析

    技术背景 在上一篇博客中,我们介绍了使用量子计算模拟器ProjectQ去生成一个随机数,也介绍了随机数的应用场景等.但是有些时候我们希望可以打开这里面实现的原理,去看看在产生随机数的过程中经历了哪些运算,调用了哪些模块.只有梳理清楚这些相关的内容,我们才能够更好的使用这个产生随机数的功能.这里我们就引入一个工具pycallgraph,可以根据执行的代码,给出这些代码背后所封装和调用的所有函数.类的关系图,让我们一起来了解下这个工具的安装和使用方法. Manjaro Linux平台安装graphv

随机推荐