Python 表达式 i += x 与 i = i + x 等价吗?

看个例子

a = [1, 2, 3]
b = a
# 写法一
b += [4]
# 写法二
# b = b + [4]
print(id(a), a)
print(id(b), b)

两种不同的写法,结果不一致

  1. 写法一结果:

    2305441971976 [1, 2, 3, 4]
    2305441971976 [1, 2, 3, 4]
  2. 写法二结果

    2113739341576 [1, 2, 3]
    2113739385672 [1, 2, 3, 4]

解释

+= 操作首先会尝试调用对象的 __iadd__方法,如果没有该方法,那么尝试调用__add__方法,先来看看这两个方法有什么区别

  • add 方法接收两个参数,返回它们的和,两个参数的值均不会改变。

  • iadd 方法同样接收两个参数,但它是属于 in-place 操作,就是说它会改变第一个参数的值,因为这需要对象是可变的,所以对于不可变对象没有__iadd__方法。

      >>> hasattr(int, '__iadd__')
    False
    >>> hasattr(list, '__iadd__')
    True

因此对于可变对象(列表,字典等)进行 += 操作时,会存在潜在的bug

Python 表达式 i += x 与 i = i + x 等价吗?的更多相关文章

  1. 一、Python表达式基础

    Python 能执行简单的计算器的功能: 如>>2+2 ==> 4,1/2==>0.5或者这样写1/2.0==>0.5(取浮点型) 1//2 ==>0 (" ...

  2. Python表达式与生成式

    Python表达式与生成式 前言 本章节中的所有知识点均为在不丧失代码可读性的前提下最大程度精简代码的一系列操作.其中涉及到一些性能问题(微乎其微)可以不做考虑. 三元表达式 三元表达式中有三个重要的 ...

  3. python表达式操作符【学习python必知必会】

    运算符 描述 实例 yield x 生成器函数发送协议   lambda args: expression 生成匿名函数   x if y else z 三元选择表达式(c系列有的 python也要有 ...

  4. Python表达式与运算符

    表达式与运算符 Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 运算符优先级 算术运算符 运算符 描述 + 加 - 两 ...

  5. Python --表达式和运算符

    表达式 由一个或者几个数字或者变量和运算符组合成的一行代码 通常会返回一个结果 运算符 由一个以上的值经过变化得到新值的过程就叫做运算 用于运算的符号称为运算符 运算符的分类: 算数运算符 比较或者关 ...

  6. Python 简明教程 --- 5,Python 表达式与运算符

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 靠代码行数来衡量开发进度,就像是凭重量来衡量飞机制造的进度. -- Bill Gates 目录 1, ...

  7. python表达式

    算术表达式: 地板除: >>> 10 // 3 3>>> 5 // 2 2>>> 5 // 31 取余: >>> 10 % 31 ...

  8. python 表达式

    运算符 参考 https://www.runoob.com/python3/python3-basic-operators.html & https://www.runoob.com/pyth ...

  9. Python表达式进阶——列表表达式

    x = 0 y = x*2 if x >= 0 else x print(y) # [表达式for变量in列表] l1 = [] l2 = [i for i in range(100) if i ...

随机推荐

  1. 01Java环境安装监测

    下载安装JDK JDK:Java开发套件 JDK下载 监测JDK安装是否成功 运行Java命令 运行Javac命令

  2. 微服务下的持续集成-Jenkins自动化部署GitHub项目

    @ 目录 一.前言 二.DevOps概念 三.为什么要做持续集成 四.常见云服务 五.手动部署Jenkins 5.1 准备工作 5.2 下载 5.3 启动 5.4 配置 5.5 Jenkins 首页 ...

  3. yum 常用命令使用

    1.向服务器上传文件或者下载文件 我们知道我们经常需要向服务器上传文件,或者从服务器下载文件,rz和sz命令可以满足我们的要求, 只不过默认情况下是不能使用的.我们需要使用yum install lr ...

  4. ubuntu 18.04安装RTL8821CE无线网卡驱动

    疫情期间闲下来无聊,把办公室的旧机器装了ubuntu,但是无法连接无线网. 打开终端 #查看无线网卡信息. -i 是不区分大小写 tjj@ubuntu:~/Documents$ lspci | gre ...

  5. Map结合Function函数式接口的巧妙之处

    需求:在给定 List 集合中,需根据不同的算法规则,选取计算方式并返回结果: 例如:[1, 2, 3, 4, 5] List 集合中都是 Integer 类型数据,根据提供的算法规则,sum 求和, ...

  6. 在 macOS 中使用 Podman

    原文链接:https://fuckcloudnative.io/posts/use-podman-in-macos/ Podman 是一个无守护程序与 Docker 命令兼容的下一代 Linux 容器 ...

  7. 面试阿里,美团,京东都会被问到的Spring ,从基础到源码帮你全搞定

    1 前言 Spring是一个轻量级开源框架,它是为了解决企业应用开发的复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框 ...

  8. yii2.0 设置默认路由

    在config/web.php 添加 $config = [ 'defaultRoute' => 'login/login', ];

  9. python办公入门3:xlrd操作工作表

    工作表 1 import xlrd 2 3 #接受工作表 4 data=xlrd.open_workbook("data.xlsx") 5 #查询第一个工作表的打开状态 6 pri ...

  10. 创建topic

    sh kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic ...