今天坐在实验室,觉得有点无聊,想了下,很久没写博客了,就来写一点,正好遇到了一个有意思的小问题,分享给大家。

首先我们通过一个小的实验来看一下内容:

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

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

此处请忽略我的输入法皮肤,很多人都说这只狗比较嚣张,我认为只是看起来的单纯的比较贱而已,哈哈哈。(跑偏了。。。)

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

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

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

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

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

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

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

# -*- coding: utf-8 -*-
# 作者:    ZFJ
# 创建时间:2019/7/510:47
# 文件:    Python_id()检测.py
# IDE:     PyCharm

a = 257
b = 257def func():c = 257# 此处的结果应该为:Falseprint(a is c)# 此处的结果应改为:True
print(a is b)
func()

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

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

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

转载于:https://www.cnblogs.com/ZFJ1094038955/p/11136973.html

Python中容易忽视的知识点相关推荐

  1. python中的正则匹配知识点

    @author: fighter Python正则表达式知识点整理. 概述:在处理字符串时,经常会遇到查找符合某些复杂规则字符串的需求,正则表达式就是用于描述这些规则的工具. 首先,我们先掌握一下py ...

  2. python中的一些小知识点

    本篇博客将会讲述python中存在的一些小知识点. 一.小知识点 1.for-else结构(即for和else不同级)如图: 知识:当迭代的对象迭代完并为空时,位于else的子句将执行,而如果在for ...

  3. Python中必须知道的知识点:上下文管理器

    在Python中让自己创建的函数.类.对象支持with语句,就实现了上线文管理协议.我们经常使用with open(file, "a+") as f:这样的语句,无需手动调用f.c ...

  4. Python中必知的知识点:文本转义及编码的常用方法

    每种语言都有其关键字和保留字符,这样为了能这些特殊字符能正常显示,就需要转义,如Python中\n代表回车,HTML中 代表空格等等. Python中的''是转义控制符,如果要表达\本身则需要使用'' ...

  5. 记录在学习python中易混淆的知识点

    这里写目录标题 列表 元组 Python中的*args和**kwargs 具有两个以上维度的数据帧切片 列表 访问列表中的列表元素: list = [123,['hello','world'],456 ...

  6. python中msg函数_Python 知识点考点之闭包

    1.预备知识--作用域(global vs local) 作用域是程序运行时变量可被访问的范围,定义在函数内的变量是局部变量. global: num = 10 # 全局作用域变量 def foo() ...

  7. Python中最重要的知识点:切片的操作,学习python一定要会的操作!

    在利用Python解决各种实际问题的过程中,经常会遇到从某个对象中抽取部分值的情况,切片操作正是专门用于完成这一操作的有力武器.理论上而言,只要条件表达式得当,可以通过单次或多次切片操作实现任意切取目 ...

  8. python的复数的实部虚部都是浮点数吗_python中复数的共轭复数知识点总结

    理科学生应该都了解过共轭吧,经常在数学或者物理还有化学中出现,在坐标轴上去描述共轭函数还是比较清晰的,py语言里也经常会出现关于共轭函数的使用,操作也非常有趣, 在计算机课上,经常被当做考试的试题,了 ...

  9. python中pivot函数用法_python中pivot()函数基础知识点

    不同于以往为大家介绍的函数使用,我们利用pivot函数可以实现的方式,就是用来重塑数据使用的,在python的使用上并不常见,但是如果需要利用这种功能,基本上能够被我们选择调用的函数,pivot函数一 ...

最新文章

  1. f2 柱状图滚动 钉钉小程序_钉钉小程序图表库AntV - F2 使用总结
  2. 【机器学习入门】图解超经典的KNN算法
  3. 双非本科上岸北大,复试成绩专业第一!
  4. oracle group by升序,group by 不一定排序
  5. amtemu v0.9.2下载_悦剪辑安卓版下载-悦剪辑app下载v2.2
  6. DiscuzNT改造系列之删除帖子后论坛版块列表同步更新
  7. 如何对SNP设计引物: CAPS, dCAPS
  8. 【200个】电子病历系统(EMR)精华资料汇总【HC3i年终盘点】
  9. 2021年末大盘点。IT行业那些薪资高前景好的岗位,你知道几个?
  10. 华为计算机网络基础知识,华为HCNE专题一:网络基础知识
  11. 第12周 上机报告 1之练习3 回文日
  12. 超带感的AR大屏互动,多元化应用场景!
  13. 兼容IE8的文件下载,解决IE下载文本和图片直接打开问题
  14. VB全局HOOK写游戏盗号木马
  15. Rockchip_Developer_Guide_USB_FFS usb测试demo
  16. APP注册登录那点事
  17. java实现编译器_实现一个简单的编译器
  18. 关于华硕飞行堡垒8开机黑屏,但键盘,电源指示灯亮
  19. 32位驱动模式写保护开关
  20. 零零信安-DD数据泄露报警日报【第20期】

热门文章

  1. linux目录数据块,如何在Linux上列出文件的数据块?
  2. 佳能7200cdn打印自检_家用打印机如何挑选? 家用打印机性价比较高的有哪些?...
  3. 数据库事务4种隔离级别和7种传播行为
  4. java设计模式迭代器模式_Java中的迭代器设计模式
  5. left+right /2_在C / C ++中使用Left Shift和Right Shift运算符
  6. jsf用于页面判断的标签_JSF –在JSF视图页面中添加标签,图像,按钮和文本字段
  7. zookeeper学习(二)之java客户端API建立连接
  8. ROS的学习(十九)用rosserial创建一个subscriber
  9. MySQL与Redis缓存问题-开课吧
  10. 完整的微服务系统应该包括哪些功能?