python里面两个大于号_听说92.8%的人答不对这道Python题,我不信,后来我信了!真有趣...
每种编程语言都有一些不为人知的陷阱,有些实际工作中会踩到,有些可能根本排不上用场,但弄明白这些陷阱有利于我们更好的去了解这门语言的实现机制。
下面这个题,你是否能一眼看出问题的本质。
不管是 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题,我不信,后来我信了!真有趣...相关推荐
- 听说92.8%的人答不对这道Python题,我不信,后来我信了!真有趣
每种编程语言都有一些不为人知的陷阱,有些实际工作中会踩到,有些可能根本排不上用场,但弄明白这些陷阱有利于我们更好的去了解这门语言的实现机制. 下面这个题,你是否能一眼看出问题的本质. 不管是 Pyth ...
- python里面两个大于号_【课堂笔记】Python常用的数值类型有哪些?
学习了视频课程<财务Python基础>,小编特为大家归纳了Python常用的数值类型和运算符,大家一起来查缺补漏吧~~ 数值类型 整型(int):整型对应我们现实世界的整数,比如1,2,1 ...
- C++/Python中两个小于号或两个大于号的作用
两个小于号或大于号的作用在C++和Python中相同,所以在此只讲述一个例子. 以C++运行环境为例: << (数字) 表示二进制左移多少位 >> (数字) 表示二进制右移多少 ...
- python 引用库的点.号_给大家分享一些实用的Python库
halo,大家好,我是特仑苏,今天给大家分享一些Python库,希望可以给大家带来一些用处! Python附带了几个预打包的库.但是,还有许多其他库可用于高级解释通用编程语言.您还可以从中了解异步Py ...
- linux 命令详解 大于号_大于号与小于号_笨办法学Bash Shell编程-基础篇视频课程_Linux视频-51CTO学院...
聪明人下笨功夫.本课程所倡导"笨办法"的核心是: ● 手动输入所有代码,不要复制粘贴! ● 正确地输入所有代码,也包括注释 ● 运行代码并保证产生相同的输出 ● 如果出现了bug, ...
- python输入两个列表a和b、利用内置函数zip()_2nd Python基础语法
第二章 基础语法的补充拓展 2.1 关于变量的机制 2.1.1 变量的创建和修改 当Python创建一个变量时,我们假设是name,赋值为zm,变量的值(zm)就会存储在计算机的内存中,而该变量的变量 ...
- python os.system(cls)没反应_这真的是全宇宙最简单的Python安装方式了
大家安装Python一般都是怎么安装的呢?每次有同学来问老师Python的安装方法时,老师都会教大家如何到Python的官网下载最新的Python安装包.但近来也有同学在反应,由于Python的官网在 ...
- 儿童学python下哪个软件好用_【开源软件】超好用的Python学习软件!没有之一!...
可以观看视频!文章结尾,有下载.安装方法! 曾几何时!Python开始掀起了一阵狂猛的学习浪潮?Python 那么Python为什么那么火? https://wenwen.sogou.com/z/q8 ...
- 学习python这门课的感受_关于我学习了编程小白的第一本Python入门书之后的感受 200110900207...
关于我学习了<编程小白的第一本Python入门书>之后的感受 200110900207 计算机类2班 胡敏 其实这本书更多的不是写关于Python的介绍的,而是关于Python的学习,也就 ...
- python如何爬取网页视频_快就完事了!10分钟用python爬取网站视频和图片
原标题:快就完事了!10分钟用python爬取网站视频和图片 话不多说,直接开讲!教你如何用Python爬虫爬取各大网站视频和图片. 638855753 网站分析: 我们点视频按钮,可以看到的链接是: ...
最新文章
- python predict_Python model.predict方法代码示例
- net.sf.json.JSONObject 和org.json.JSONObject 的差别
- RHEL5下NFS服务器配置与应用
- Qualcomm thermal的介绍
- Linux console on LCD
- android crop 大图,com.android.camera.action.CROP 实现图片剪裁
- 大战设计模式【12】—— 迭代器模式
- 连锁零售行业ERP解决方案
- functools.partial
- JS广告代码效果大全
- vue的基础总结(vue的非脚手架总结)
- 股市里的定律-福克兰定律
- linux 学习 个人总结笔录(五)
- org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; 文件提前结
- for 循环打印直角三角形、正三角形、棱形
- be idle sometimes to_英语美文_双语美文:趁着年轻做自己想做的事_沪江英语
- double浮点数转字符串算法
- 2022最新自动化测试面试题及答案
- EasyUI上传图片,前台预览,后台读取
- 1905. 统计子岛屿-深度优先遍历图