python中等于号可以用is代替_python中is与双等于号“==”的区别示例详解
前言
在開始本文之前,首先要知道Python中對象包含的三個基本要素,分別是:id(身份標識)、python type()(數(shù)據(jù)類型)和value(值)。is和==都是對對象進行比較判斷作用的,但對對象比較判斷的內(nèi)容并不相同。下面來看看具體區(qū)別在哪。
發(fā)現(xiàn)問題
最近在給小伙伴寫段小代碼用于爬取一個GIS的各高層數(shù)據(jù),python中使用了”is”來代替”==”,結(jié)果下載至512的時候出了問題。
代碼如下
def get_next(x, y, z):
z += 1
if z is 2**x: # 應(yīng)該用if z == 2**x
y += 1
z = 0
if y is 2**(x+1):
x += 1
y = 0
return x, y, z
這是用來獲取下一個高層數(shù)據(jù)的URL的函數(shù),結(jié)果第二天,小伙伴告訴我說下載到x == 9, y == 0, z == 512的時候停止下載了。
探索
首先,根據(jù)上述代碼可以知道,z按照邏輯是不可能等于512的,所有開始懷疑是不是這個函數(shù)有問題,但是這么簡單的函數(shù),怎么看都不應(yīng)該有問題啊。于是開始跟代碼,發(fā)現(xiàn)
if z is 2**x
處,x == 9, y == 0, z == 512時,if后面居然返回的是False。我拿計算器算了好幾遍,確定自己不是在二次元后,開始懷疑is的問題。
結(jié)果
在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
然后自己寫了個小段子看看最大的可復(fù)用的int是多大
a = 0
b = 0
while a is b:
a += 1
b += 1
最后發(fā)現(xiàn)最大是256。
小結(jié):
==比較操作符:用來比較兩個對象是否相等,value做為判斷因素;
is同一性運算符:比較判斷兩個對象是否相同,id做為判斷因素。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對的支持。
總結(jié)
以上是生活随笔為你收集整理的python中等于号可以用is代替_python中is与双等于号“==”的区别示例详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java常见不可变类_Java语言不可变
- 下一篇: 安卓java增加属性_如何使用Java读