一:变量、内存理解

变量:用来标识(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和==的区别相关推荐

  1. pythonis啥意思-Python中is和==的区别

    Python中有很多运算符,今天我们就来讲讲is和==两种运算符在应用上的本质区别是什么. 在讲is和==这两种运算符区别之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识) ...

  2. python基础元组和列表区别(六)

    元组一旦创建,长度和元素不可改变. 列表是一个可变的元素和长度.

  3. f是一个python内部变量类型,Python基础变量类型——List浅析

    Python使用list 一.list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示 ...

  4. python 等号报错_Python学习----Python基础

    Python基础 一.数据类型和变量 1.在Python中,等号=是赋值语句,可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量. 例如: a =520# a是整数prin ...

  5. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  6. Python学习笔记1 Python基础

    第1章 Python基础 1.1 Python概述及版本介绍 1.Python是一种面向对象的解释型计算机程序设计语言(解释型语言源代码->解释器逐行解释每一句源代码) 2.优点:高级语言.可移 ...

  7. python基础---元组、字典、函数、文件、异常

    文章目录 python基础---元组.字典.函数.文件.异常 Tuple(元组) 常用操作 dict(字典) 函数 文件 异常 python基础-元组.字典.函数.文件.异常 Tuple(元组) tu ...

  8. 快速掌握Python的捷径-Python基础前传(1)

    文: jacky(朱元禄) 开文序 最近看新闻,发现高考都考Python了,随着人工智能的火热,学数据科学的人越来越多了!但对于数据行业本身来说,现象级的火热,这并不是什么好事.  方丈高楼平地起,无 ...

  9. Python培训教程之Python基础知识点梳理

    Python语言是入门IT行业比较快速且简单的一门编程语言,学习Python语言不仅有着非常大的发展空间,还可以有一个非常好的工作,下面小编就来给大家分享一篇Python培训教程之Python基础知识 ...

最新文章

  1. 在Ubuntu 14.04和CentOS上安装boost1.55二进制包
  2. 使用阿里云OSS上传文件
  3. linux c rename 重命名文件和文件夹
  4. 专用码计算机英语怎么说,计算机专用英语词汇整理
  5. 使用 FlipClock.js 制作精美的时钟、定时器和倒计时功能
  6. Java基础-Java中的内存分配与回收机制
  7. 怎么查看eclipse的版本号
  8. 从零开始学keras之神经网络的数学表示
  9. diskgenius 单文件_电脑数据恢复及分区管理软件DiskGenius 英文专业版
  10. sql批量修改数据_Excel技巧 | 如何批量修改行列数据
  11. OpenMP4.0: #pragma openmp simd实现SIMD指令优化(ARM,X86,MIPS)
  12. qq空间把android改成iphone,qq空间利用代码修改iPhone6 Plus详细方法 qq空间修改手机型号教程...
  13. html中img的title属性值,img标签中alt属性和title属性的区别是什么?
  14. JIRA统计工时,我们用Tempo
  15. 8.12 腾讯大战360 2133
  16. 【MATLAB】GA优化算法整定PID控制器参数(三)—— 一阶带时延的被控对象
  17. 私有云基础架构设计:存储、网络、计算、安全和应用的设计最佳实践及案例
  18. python求逆矩阵的方法,Python 如何求矩阵的逆
  19. 华为eNSP-ISIS理论+实验配置
  20. Hastelloy G-35哈氏合金板材 棒材

热门文章

  1. MLPClassifier 隐藏层不包括输入和输出
  2. 思科安全:加密流量威胁检测、加密流量威胁和恶意软件检测、识别无线干扰或威胁、Talos 情报源可加强对已知和新型威胁的防御、分布式安全异常检测...
  3. tensorflow sigmoid_cross_entropy_with_logits 函数解释
  4. 论海明威的存在主义宗教意识——存在主义虚无主义。注:部分观点个人不赞同...
  5. show line numbers
  6. tensorflow学习笔记——使用TensorFlow操作MNIST数据(1)
  7. c# async await 理解 结合并行处理
  8. Access 字段拼接(UPDATE 数据追加)
  9. Axure RP pro 6.5 密钥
  10. CachedNetworkImage 图片缓存