​​增强型赋值语句是经常被使用到的,因为从各种学习渠道中,我们能够得知 i += 1 的效率往往要比 i = i + 1 更高一些(这里以 += 为例,实际上增强型赋值语句不仅限于此)。所以我们会乐此不疲的在任何能够替换普通赋值语句的地方使用增量型赋值语句,以此来优化代码。那么我们是否有想过,在什么情况下 i += 1 其实并不等效于 i = i + 1 !!

例一:使用增强型赋值语句:

In [1]: a = [1, 2, 3]
In [2]: b = a
In [3]: b += [1, 2, 3]
In [4]: print a, b
[1, 2, 3, 1, 2, 3] [1, 2, 3, 1, 2, 3]
In [5]: id(a), id(b)
Out[5]: (140213762276096, 140213762276096)

例二:使用普通赋值语句:

In [6]: a = [1, 2, 3]
In [7]: b = a
In [8]: b = b + [1, 2, 3]
In [9]: print a, b
[1, 2, 3] [1, 2, 3, 1, 2, 3]
In [10]: id(a), id(b)
Out[10]: (140213762466232, 140213762276168)

上述两个例子中,将一个列表类型对象赋值给变量 a,再将变量 a 赋值给变量 b,此时 a、b 指向了同一个内存对象 [1, 2, 3]。然后分别应用增量赋值运算符和普通赋值运算符来操作变量 b。从最后的结果来看,例一中的 a、b 在进行运算后依旧指向了同一个内存对象。例二则相反,a、b 分别指向了不同的内存对象,也就是说在例二中隐式的新建了一个内存对象。

这是一个值得注意的坑,警惕我们在使用增量赋值运算符来操作可变对象(如:列表)时可能会产生不可预测的结果。

要解释这个问题,首先需要了解「Python 共享引用」的概念:在 Python 中,允许若干个不同的变量引用指向同一个内存对象。同时在前文中也提到,增强赋值语句比普通赋值语句的效率更高,这是因为在 Python 源码中, 增强赋值比普通赋值多实现了“写回”的功能,也就是说增强赋值在条件符合的情况下(例如:操作数是一个可变类型对象)会以追加的方式来进行处理,而普通赋值则会以新建的方式进行处理。这一特点导致了增强赋值语句中的变量对象始终只有一个,Python 解析器解析该语句时不会额外创建出新的内存对象。所以例一中变量 a、b 的引用在最后依旧指向了同一个内存对象;相反,对于普通赋值运算语句,Python 解析器无法分辨语句中的两个同名变量(例如:b = b + 1)是否应该为同一内存对象,所以干脆再创建出一个新的内存对象用来存放最后的运算结果,所以例二中的 a、b 从原来指向同一内存对象,到最后分别指向了两个不同的内存对象。

​这是一个不为人所熟知的问题,我们能得到的结论就是:尽量不要使用增量赋值运算符来处理任何可变类型对象,除非你对上述问题有了足够的了解。

Python 笔试集:什么时候 i = i + 1 并不等于 i += 1?相关推荐

  1. Python 笔试集(4):True + True == ?

    目录 目录 前文列表 面试题True Ture 布尔值 布尔类型是特殊的整数类型 前文列表 Python 笔试集:什么时候 i = i + 1 并不等于 i += 1? Python 笔试集(1):关 ...

  2. Python 笔试集(2):你不知道的 Python 整数

    面试题 分别给出下述代码在终端(e.g. IPyhon)中和在程序中的运行结果: a = 256 b = 256c = 257 d = 257def foo():e = 257f = 257print ...

  3. Python 笔试集(1):关于 Python 链式赋值的坑

    前言 Python 的链式赋值是一种简易型批量赋值语句,一行代码即可为多个变量同时进行赋值. 例如: x = y = z = 1 链式赋值是一种非常优雅的赋值方式,简单.高效且实用.但同时它也是一个危 ...

  4. 这可能是史上最全的Python算法集!

    来源 | CSDN(ID:CSDNnews ) 本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点:选择了在实践中广泛应用的算法:依赖最少:容易阅读,容易理解每个 ...

  5. python优化算法工具包_这可能是史上最全的 Python 算法集(建议收藏)

    原标题:这可能是史上最全的 Python 算法集(建议收藏) 导读:本文是一些机器人算法(特别是自动导航算法)的Python代码合集.其主要特点有以下三点: 选择了在实践中广泛应用的算法: 依赖最少: ...

  6. python简单代码 春节集五福-新年福利来一波之Python轻松集齐五福(demo)

    新的一年又要到来了,各个大的公司又在这年末为大家送上了新春的祝福,支付宝还是延续了这几年的传统,在年末为大家送上了集五福的活动,为了大家能更快更好的扫出来大大的"福",今天就带领大 ...

  7. 零基础python必背代码-零基础入门学习python 96集全

    零基础入门学习python 96集全 第000讲 愉快的开始(视频+课件)xa0 第001讲 我和Python第一次亲密接触(视频+课件)xa0 第002讲 用Python设第一个游戏(视频+课件+源 ...

  8. python算法动画_这可能是史上最全的Python算法集!

    来源 | CSDN(ID:CSDNnews ) 本文是一些机器人算法(特别是自动导航算法)的Python代码合集. 其主要特点有以下三点:选择了在实践中广泛应用的算法:依赖最少:容易阅读,容易理解每个 ...

  9. 2022年Python笔试选择题及答案(秋招)

    2022年Python笔试选择题及答案(秋招)

最新文章

  1. 存储组和数据库的区别?
  2. 利用html5标签audio在不同客户端下适配播放音频
  3. 将声音转为图片(二维矩阵)
  4. 计算机保密工作自查自评报告,2020年保密工作自查自评报告
  5. scp选择二进制_二进制传输与文本传输区别
  6. Atom编辑器有一个LF、CRLF的切换
  7. 【题解】跳房子-C++
  8. 傳統經理人的迷思(转)
  9. [转]bss,data,rodata,text
  10. mxchip EWM3166串口转WIFI AT指令设置
  11. Android10 BT MAC地址获取流程
  12. 求素数(质数)算法的N种境界 - 试除法和初级筛法
  13. 【设计】资料合集(1-121)副业学习会
  14. 获取国家法定节假日和周末
  15. python 英文关键词提取_python 利用jieba.analyse进行 关键词提取
  16. Android OKHttp 拦截器
  17. Jzoj2197 三核苷酸
  18. android animator
  19. 键盘的复制粘贴快捷键总是需要重复多次才起作用
  20. 采油工技能鉴定高级工计算机6,采油工技师、高级技师技能鉴定题库(宝典).doc...

热门文章

  1. 共享服务器不能远程重启,彻底解决服务器重启失败或重启缓慢无法远程的问题...
  2. php写出个人所得税,PHP计算个人所得税示例【不使用速算扣除数】
  3. mysql 定时计划_MYSQL定时任务
  4. Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理
  5. 脑机接口可以实时从脑电波中重建人脑中的图片?
  6. 游戏中的人工智能(AI)和行为树科普
  7. android 键盘只顶edittext,EditText Keyboard 未解之谜
  8. 150名打工人被AI判定“效率低”遭开除,网友:属实是人工智能,能治工人
  9. AI医疗版App Store来了:GE发布“爱迪生魔盒”,集成各方医疗方案,李开复点赞...
  10. GRE作文用AI打分,已经20周年了:AI给中国考生的分数,远高于人类打分