pythonis啥意思-Python基础:is和==的区别
一:变量、内存理解
变量:用来标识(identify)一块内存区域。为了方便表示内存,我们操作变量实质上是在操作变量指向的那块内存单元。编译器负责分配。我们可以使用Python内建函数id()来获取变量的地址
变量名:是一个标识符(dientify),用来代之一块内存空间,使用这个变量名,我们可以很方便的操作这块内存区域。
内存:内存是我们电脑硬件,用来存放数据,形象的理解就是内存有一个一个的小格子组成,每个格子的大小是一个字节,每个格子可以存放一个字节大小的数据。我们如何才能知道,数据存放在哪些格子中,那就得靠地址,地址类似于楼房的门牌号,是内存的标识符。
二:id()
id(object)函数是返回对象object在其生命周期内位于内存中的地址,id函数的参数类型是一个对象。
三:is 和 ==是什么
在 Python 中一切都是对象,毫无例外整数也是对象,对象之间比较是否相等可以用==,也可以用is。==和is操作的区别是:
Is
比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。
==
比较的是两个对象的内容是否相等,默认会调用对象的__eq__()方法。
四:数据池
--->is比较id是否是同一个内存
1:int
----->范围[-5, 256]
对于257,a is b返回的竟然是False,结果可能在你的意料之中,也有可能出乎你的意料,但不管怎么,我们还是要刨根问底,找出问题的真相。
解惑一
出于对性能的考虑,Python内部做了很多的优化工作,对于整数对象,Python把一些频繁使用的整数对象缓存起来,保存到一个叫small_ints的链表中,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。Python把这些可能频繁使用的整数对象规定在范围[-5, 256]之间的小对象放在small_ints中,但凡是需要用些小整数时,就从这里面取,不再去临时创建新的对象。因为257不再小整数范围内,因此尽管a和b的值是一样,但是他们在Python内部却是以两个独立的对象存在的,各自为政,互不干涉。
弄明白第一个问题后,我们继续在Python交互式命令行中写一个函数,再来看下面这段代码:
片段一:
>>> c = 257
>>> def foo():
... a = 257
... b = 257
... print a is b
... print a is c
...
>>> foo()
True
False
呃,什么情况,是的,你没看错,片段一中的这段代码 a、b 值都是257的情况下,出现了a is b返回True,而a is c 返回的False,a、b、c的值都为257,为什么会出现不同的结果呢?这对于刚刚好不容易建立起来的认知就被彻底否决了吗,那这段代码中究竟发生了什么?难道解惑一中的结论是错误的吗?
解惑二
为了弄清楚这个问题,我们有必要先理解程序代码块的概念。Python程序由代码块构成,代码块作为程序的一个最小基本单位来执行。一个模块文件、一个函数体、一个类、交互式命令中的单行代码都叫做一个代码块。在上面这段代码中,由两个代码块构成,c = 257作为一个代码块,函数foo作为另外一个代码块。Python内部为了将性能进一步的提高,凡是在一个代码块中创建的整数对象,如果存在一个值与其相同的对象于该代码块中了,那么就直接引用,否则创建一个新的对象出来。Python出于对性能的考虑,但凡是不可变对象,在同一个代码块中的对象,只有是值相同的对象,就不会重复创建,而是直接引用已经存在的对象。因此,不仅是整数对象,还有字符串对象也遵循同样的原则。所以 a is b就理所当然的返回True了,而c和a不在同一个代码块中,因此在Python内部创建了两个值都是257的对象。
一番长篇大论之后,得出两点结论:
1、小整数对象[-5,256]是全局解释器范围内被重复使用,永远不会被GC回收。
2、同一个代码块中的不可变对象,只要值是相等的就不会重复创建新的对象。
2:str:
不能有特殊字符串,全部由字母组成的字符串
字符串中单个*20以内他们的内存地址一样,单个*21以上,内存地址不一样
3:py文件
在一个py文件中,只要内容一样,内存就一样
pythonis啥意思-Python基础:is和==的区别相关推荐
- pythonis啥意思-Python中is和==的区别
Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么. 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识) ...
- python基础元组和列表区别(六)
元组一旦创建,长度和元素不可改变. 列表是一个可变的元素和长度.
- f是一个python内部变量类型,Python基础变量类型——List浅析
Python使用list 一.list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示 ...
- python 等号报错_Python学习----Python基础
Python基础 一.数据类型和变量 1.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量. 例如: a =520# a是整数prin ...
- python基础——继承与派生、组合
python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...
- Python学习笔记1 Python基础
第1章 Python基础 1.1 Python概述及版本介绍 1.Python是一种面向对象的解释型计算机程序设计语言(解释型语言源代码->解释器逐行解释每一句源代码) 2.优点:高级语言.可移 ...
- python基础---元组、字典、函数、文件、异常
文章目录 python基础---元组.字典.函数.文件.异常 Tuple(元组) 常用操作 dict(字典) 函数 文件 异常 python基础-元组.字典.函数.文件.异常 Tuple(元组) tu ...
- 快速掌握Python的捷径-Python基础前传(1)
文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事. 方丈高楼平地起,无 ...
- Python培训教程之Python基础知识点梳理
Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小编就来给大家分享一篇Python培训教程之Python基础知识 ...
最新文章
- 在Ubuntu 14.04和CentOS上安装boost1.55二进制包
- 使用阿里云OSS上传文件
- linux c rename 重命名文件和文件夹
- 专用码计算机英语怎么说,计算机专用英语词汇整理
- 使用 FlipClock.js 制作精美的时钟、定时器和倒计时功能
- Java基础-Java中的内存分配与回收机制
- 怎么查看eclipse的版本号
- 从零开始学keras之神经网络的数学表示
- diskgenius 单文件_电脑数据恢复及分区管理软件DiskGenius 英文专业版
- sql批量修改数据_Excel技巧 | 如何批量修改行列数据
- OpenMP4.0: #pragma openmp simd实现SIMD指令优化(ARM,X86,MIPS)
- qq空间把android改成iphone,qq空间利用代码修改iPhone6 Plus详细方法 qq空间修改手机型号教程...
- html中img的title属性值,img标签中alt属性和title属性的区别是什么?
- JIRA统计工时,我们用Tempo
- 8.12 腾讯大战360 2133
- 【MATLAB】GA优化算法整定PID控制器参数(三)—— 一阶带时延的被控对象
- 私有云基础架构设计:存储、网络、计算、安全和应用的设计最佳实践及案例
- python求逆矩阵的方法,Python 如何求矩阵的逆
- 华为eNSP-ISIS理论+实验配置
- Hastelloy G-35哈氏合金板材 棒材
热门文章
- MLPClassifier 隐藏层不包括输入和输出
- 思科安全:加密流量威胁检测、加密流量威胁和恶意软件检测、识别无线干扰或威胁、Talos 情报源可加强对已知和新型威胁的防御、分布式安全异常检测...
- tensorflow sigmoid_cross_entropy_with_logits 函数解释
- 论海明威的存在主义宗教意识——存在主义虚无主义。注:部分观点个人不赞同...
- show line numbers
- tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
- c# async await 理解 结合并行处理
- Access 字段拼接(UPDATE 数据追加)
- Axure RP pro 6.5 密钥
- CachedNetworkImage 图片缓存