python中is与双等于号“==”的区别示例详解

 更新时间:2017年11月21日 09:14:15   作者:Jason Hu  
Python中有很多运算符,下面这篇文章主要给大家介绍了关于python中is与双等于号“==”区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

在开始本文之前,首先要知道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做为判断因素。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Pytorch基本变量类型FloatTensor与Variable用法

    Pytorch基本变量类型FloatTensor与Variable用法

    今天小编就为大家分享一篇Pytorch基本变量类型FloatTensor与Variable用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • 用python给csv里的数据排序的具体代码

    用python给csv里的数据排序的具体代码

    在本文里小编给大家分享的是关于用python给csv里的数据排序的具体代码内容,需要的朋友们可以学习下。
    2020-07-07
  • 学习python分支结构

    学习python分支结构

    在本篇文章中小编给大家分享了关于python分支结构的相关知识点和相关内容,需要的朋友们学习下。
    2019-05-05
  • python/sympy求解矩阵方程的方法

    python/sympy求解矩阵方程的方法

    今天小编就为大家分享一篇python/sympy求解矩阵方程的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python3 扫描库文件并获取版本号信息的操作方法

    Python3 扫描库文件并获取版本号信息的操作方法

    在 C/C++ 开发中使用了第三方库,具体说是 .a, .lib, .dll 等文件,想通过 Python 查询出这些文件中的版本号信息,下面小编给大家带来了Python3中扫描库文件并获取版本号信息的知识,需要的朋友可以参考下
    2023-05-05
  • 基于Python和PyYAML读取yaml配置文件数据

    基于Python和PyYAML读取yaml配置文件数据

    这篇文章主要介绍了基于Python和PyYAML读取yaml配置文件数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • pandas 数据归一化以及行删除例程的方法

    pandas 数据归一化以及行删除例程的方法

    今天小编就为大家分享一篇pandas 数据归一化以及行删除例程的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-11-11
  • Python操作SQLite简明教程

    Python操作SQLite简明教程

    这篇文章主要介绍了Python操作SQLite简明教程,简单明了的入门教程,包含连接、建表、增删修查等例子,需要的朋友可以参考下
    2014-07-07
  • python容器的内置通用函数操作

    python容器的内置通用函数操作

    容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in, not in关键字判断元素是否包含在容器中。接下来通过本文给大家介绍python容器的内置通用函数操作,感兴趣的朋友一起看看吧
    2021-11-11
  • Python格式化输出%s和%d

    Python格式化输出%s和%d

    本篇文章主要介绍了Python格式化输出%s和%d的实例案例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论