网络编程
位置:首页>> 网络编程>> Python编程>> python中is与双等于号“==”的区别示例详解

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

作者:Jason Hu  发布时间:2023-07-09 22:40:19 

标签: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做为判断因素。

来源:http://0xng.com/2017/11/21/python中is和双等于号的区别/

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com