python中is与双等于号“==”的区别示例详解
作者:Jason Hu 发布时间:2023-07-09 22:40:19
前言
在开始本文之前,首先要知道Python中对象包含的三个基本要素,分别是:id(身份标识)、python type()(数据类型)和value(值)。is和==都是对对象进行比较判断作用的,但对对象比较判断的内容并不相同。下面来看看具体区别在哪。
发现问题
最近在给小伙伴写段小代码用于爬取一个GIS的各高层数据,python中使用了”is”来代替”==”,结果下载至512的时候出了问题。
代码如下
def get_next(x, y, z):
z += 1
if z is 2**x: # 应该用if z == 2**x
y += 1
z = 0
if y is 2**(x+1):
x += 1
y = 0
return x, y, z
这是用来获取下一个高层数据的URL的函数,结果第二天,小伙伴告诉我说下载到x == 9, y == 0, z == 512的时候停止下载了。
探索
首先,根据上述代码可以知道,z按照逻辑是不可能等于512的,所有开始怀疑是不是这个函数有问题,但是这么简单的函数,怎么看都不应该有问题啊。于是开始跟代码,发现
if z is 2**x
处,x == 9, y == 0, z == 512时,if后面居然返回的是False。我拿计算器算了好几遍,确定自己不是在二次元后,开始怀疑is的问题。
结果
在StackOverflow上面找到了答案
Is there a difference between == and is in Python?
is will return True if two variables point to the same object, == if the objects referred to by the variables are equal.
>>> a = [1, 2, 3]
>>> b = a
>>> b is a
True
>>> b == a
True
>>> b = a[:]
>>> b is a
False
>>> b == a
True
In your case, the second test only works because Python caches small integer objects, which is an implementation detail. For larger integers, this does not work:
>>> 1000 is 10**3
False
>>> 1000 == 10**3
True
然后自己写了个小段子看看最大的可复用的int是多大
a = 0
b = 0
while a is b:
a += 1
b += 1
最后发现最大是256。
小结:
==比较操作符:用来比较两个对象是否相等,value做为判断因素;
is同一性运算符:比较判断两个对象是否相同,id做为判断因素。
来源:http://0xng.com/2017/11/21/python中is和双等于号的区别/


猜你喜欢
- 编写思路:把本地文件在客户端通过base64编码以后发送目的地.测试过程中,上传文件过大,导致超时不成功.后来经过改善.把编码分段发送.测试
- 如果管理网络设备很多,不可能靠人力每天去登录设备去查看是否在线。所以,可以利用python脚本通过每天扫描网络中的在线设备。可以部署在服务器
- 防止用户通过后退按钮重复提交表单 <% response.Buffer=true response.Expires=0 respons
- 本文实例讲述了Python元组常见操作。分享给大家供大家参考,具体如下:不能修改的列表就叫做元组。1 访问元素元组是使用圆括号来标识的。 定
- Python 环境下文件的读取问题,请参见拙文 Python基础之文件读取的讲解这是一道著名的 Python 面试题,考察的问题是,Pyth
- 本文实例讲述了原生javascript运动函数的封装。分享给大家供大家参考,具体如下://封装匀速运动//参数:// 1、dom对象// 2
- Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码
- 一、mysql主(称master)从(称slave)复制的原理: (1).mas
- 项目实现利用face++开发一个课堂签到的软件,实现面向摄像头即可完成记录学号、姓名和时间的签到工作。项目架构项目使用场景代码:流程代码,主
- 1.requiremwnts:Django版本:2.2python版本:3.6djangorestframework版本:3.1django
- 第一种方法: 代码如下:Minimsdn.com为您提供的代码: -- Turn ON [Display IO Info when exec
- 前言Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j
- 可以在Mac OS X 10.2.x(“Jaguar”)和以上版本上Mac OS X使用二进制安装软
- 前言事务性数据字典与原子DDL,是MySQL 8.0推出的两个非常重要的新特性,之所以将这两个新特性放在一起,是因为两者密切相关,事务性数据
- type()方法返回传递变量的类型。如果传递变量是字典那么它将返回一个字典类型。语法以下是type()方法的语法:type(di
- Numpy创建矩阵并等间隔抽取数据1、利用Numpy创建向量和二维矩阵1.1 创建向量得到需要强调的是,向量的维度,在python中并不是书
- 配置环境: 1、数 据 库:Oracle 8i R2 (8.1.7) for NT 企业版 2、安装路径:C:ORACLE 实现方法: 1.
- 变量的缓存机制变量的缓存机制(以下内容仅对python3.6.x版本负责)机制只要有两个值相同,就只开辟一个空间为什么要有这样的机制在计算机
- 前言每一个孩子都像星空中的一颗星星,散发着自己所特有的光芒照亮着整个夜空。今天就带大家用27行Python代码绘制一幅满天星吧。全局设置在绘
- MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了