每种编程语言都有一些不为人知的陷阱,有些实际工作中会踩到,有些可能根本排不上用场,但弄明白这些陷阱有利于我们更好的去了解这门语言的实现机制。

下面这个题,你是否能一眼看出问题的本质。

不管是 Python2 还是 Python3 环境下,只要你是在 CPython 的交互式命令行 REPL 中执行,结果没什么不同。

我们知道 is 比较的是两个对象的内存地址是否一样( id 函数返回一个和对象的内存地址相关的值),言外之意就是看a,b两个变量是否指向同一个对象。我们来看看每个变量的 id 值。

不出所料,前后两组 a,b的 id 值是相同的,只有中间这组 id 值不一样,我们可以对其简单分析一下原因。在 Python 中,一切皆为对象,理论上任意两个对象的 id 值都是不一样的!

嗨喽:正在学习python的小伙伴或者打算学习的,可以私信小编“01”领取资料!

例如:

>>> nums = [1,2,3,4]>>> id(nums)15148936>>> nums2 = [1,2,3]>>> id(nums2)15160824>>> nums3 = [1,2,3]>>> id(nums3)15160864

看得出每个对象的 id 值是不同的,哪怕两个对象的值(内容)相同,他们的 id 值也是不一样的(nums2和nums3)。那为什么前面第一组两个对象的id值相同呢?可能有些同学已经知道了

因为在 Python 中,我们需要使用对象的时候 Python 就会为我们创建好,当不需要了它就会进行回收,就好比屋子里面的东西用完之后,要及时清理,否则整个屋子很快就会堆满,最终导致房间再也塞不进任何东西。

同样的,为了提高性能,Python 就把一些常用的整数专门缓存起来,就像屋子里面有些东西总是每天都要频繁使用,比如床,你不能说睡完之后,就把床搬出去,要用了再搬回来,这样的效率太低,因为这个搬运过程实在是太耗时了。于是,我们可以专门拿一块空间用来放置这个床。

Python 中也是同样的道理,因为整数是我们经常使用的对象,为了避免重复的创建、回收,干脆就把那些常用的整数缓存起来,每次需要使用时直接从缓存中拿,而不是重新创建(重新创建的话,肯定是一个全新的对象)。这些整数的范围是[-5, 256],当然这个数字范围是Python之父决定的,你要改,必须重新编译Python环境。

现在我们就能解释第一组为什么是True,第二组为什么是False了。为什么第三组结果又是 True 了?,不是说好大于256的整数不再缓存,每次使用都是新对象吗?别急,再听我啰嗦一下。

还是出于性能考虑,Python内部做了进一步优化,怎么优化呢?但凡是在同一个代码块中的代码,如果出现两个值相同的整数,那么它们将被重用,来看下面这个代码:

# test.py# -*- coding: utf-8 -*-a = 257b = 257def func(): c = 257 print(a is c) # Falseprint(a is b) # Truefunc()

上面代码是在一个 test.py 文件中,运行时,a和b的id值相同,而c的id值与a不一样,因为a、b 在同一个代码块,属于模块级别,而 c 是在函数里面,属于局部变量,他们不属于同一代码块中,因此函数里面的 257 这个对象时会重新创建,而创建 b 的时候,发现同级代码块中有个257的值了,就重用了这个对象。

再回到前面讲的第三组值,在 Python 的交互式命令行 REPL 中,每单独一行都视为一个代码块,同一行中的代码属于同一个代码块,因此不难理解,第三组中的a和b处在同一个代码块中,所以后者重用了前者,因此,两个变量的id是相同的。

有没有觉得这是一个坑。虽然我们实际场景中并不一定能用上,但是至少我们知道了Python为我们做的一些优化工作。

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

python里面两个大于号_听说92.8%的人答不对这道Python题,我不信,后来我信了!真有趣...相关推荐

  1. 听说92.8%的人答不对这道Python题,我不信,后来我信了!真有趣

    每种编程语言都有一些不为人知的陷阱,有些实际工作中会踩到,有些可能根本排不上用场,但弄明白这些陷阱有利于我们更好的去了解这门语言的实现机制. 下面这个题,你是否能一眼看出问题的本质. 不管是 Pyth ...

  2. python里面两个大于号_【课堂笔记】Python常用的数值类型有哪些?

    学习了视频课程<财务Python基础>,小编特为大家归纳了Python常用的数值类型和运算符,大家一起来查缺补漏吧~~ 数值类型 整型(int):整型对应我们现实世界的整数,比如1,2,1 ...

  3. C++/Python中两个小于号或两个大于号的作用

    两个小于号或大于号的作用在C++和Python中相同,所以在此只讲述一个例子. 以C++运行环境为例: << (数字) 表示二进制左移多少位 >> (数字) 表示二进制右移多少 ...

  4. python 引用库的点.号_给大家分享一些实用的Python库

    halo,大家好,我是特仑苏,今天给大家分享一些Python库,希望可以给大家带来一些用处! Python附带了几个预打包的库.但是,还有许多其他库可用于高级解释通用编程语言.您还可以从中了解异步Py ...

  5. linux 命令详解 大于号_大于号与小于号_笨办法学Bash Shell编程-基础篇视频课程_Linux视频-51CTO学院...

    聪明人下笨功夫.本课程所倡导"笨办法"的核心是: ● 手动输入所有代码,不要复制粘贴! ● 正确地输入所有代码,也包括注释 ● 运行代码并保证产生相同的输出 ● 如果出现了bug, ...

  6. python输入两个列表a和b、利用内置函数zip()_2nd Python基础语法

    第二章 基础语法的补充拓展 2.1 关于变量的机制 2.1.1 变量的创建和修改 当Python创建一个变量时,我们假设是name,赋值为zm,变量的值(zm)就会存储在计算机的内存中,而该变量的变量 ...

  7. python os.system(cls)没反应_这真的是全宇宙最简单的Python安装方式了

    大家安装Python一般都是怎么安装的呢?每次有同学来问老师Python的安装方法时,老师都会教大家如何到Python的官网下载最新的Python安装包.但近来也有同学在反应,由于Python的官网在 ...

  8. 儿童学python下哪个软件好用_【开源软件】超好用的Python学习软件!没有之一!...

    可以观看视频!文章结尾,有下载.安装方法! 曾几何时!Python开始掀起了一阵狂猛的学习浪潮?Python 那么Python为什么那么火? https://wenwen.sogou.com/z/q8 ...

  9. 学习python这门课的感受_关于我学习了编程小白的第一本Python入门书之后的感受 200110900207...

    关于我学习了<编程小白的第一本Python入门书>之后的感受 200110900207 计算机类2班 胡敏 其实这本书更多的不是写关于Python的介绍的,而是关于Python的学习,也就 ...

  10. python如何爬取网页视频_快就完事了!10分钟用python爬取网站视频和图片

    原标题:快就完事了!10分钟用python爬取网站视频和图片 话不多说,直接开讲!教你如何用Python爬虫爬取各大网站视频和图片. 638855753 网站分析: 我们点视频按钮,可以看到的链接是: ...

最新文章

  1. python predict_Python model.predict方法代码示例
  2. net.sf.json.JSONObject 和org.json.JSONObject 的差别
  3. RHEL5下NFS服务器配置与应用
  4. Qualcomm thermal的介绍
  5. Linux console on LCD
  6. android crop 大图,com.android.camera.action.CROP 实现图片剪裁
  7. 大战设计模式【12】—— 迭代器模式
  8. 连锁零售行业ERP解决方案
  9. functools.partial
  10. JS广告代码效果大全
  11. vue的基础总结(vue的非脚手架总结)
  12. 股市里的定律-福克兰定律
  13. linux 学习 个人总结笔录(五)
  14. org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结
  15. for 循环打印直角三角形、正三角形、棱形
  16. be idle sometimes to_英语美文_双语美文:趁着年轻做自己想做的事_沪江英语
  17. double浮点数转字符串算法
  18. 2022最新自动化测试面试题及答案
  19. EasyUI上传图片,前台预览,后台读取
  20. 1905. 统计子岛屿-深度优先遍历图

热门文章

  1. AutoCompleteTextView输入汉字拼音首字母实现过滤提示(支持多音字,Filterable的使用)...
  2. 做好数据分析的关键是打好组合拳
  3. 单层的神经网络使用自定义的损失函数
  4. OC 类的load方法
  5. Centos 03 基础命令
  6. jquery ajax 请求中多出现一次OPTIONS请求及其解决办法
  7. shell基础:输入输出重定向
  8. iOS之正则表达式的使用
  9. 高等数学_第一章第一节_映射与级数
  10. mysql 跨数据库联表查询