python中is與雙等于號(hào)“==”的區(qū)別示例詳解
前言
在開始本文之前,首先要知道Python中對(duì)象包含的三個(gè)基本要素,分別是:id(身份標(biāo)識(shí))、python type()(數(shù)據(jù)類型)和value(值)。is和==都是對(duì)對(duì)象進(jìn)行比較判斷作用的,但對(duì)對(duì)象比較判斷的內(nèi)容并不相同。下面來看看具體區(qū)別在哪。
發(fā)現(xiàn)問題
最近在給小伙伴寫段小代碼用于爬取一個(gè)GIS的各高層數(shù)據(jù),python中使用了”is”來代替”==”,結(jié)果下載至512的時(shí)候出了問題。
代碼如下
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
這是用來獲取下一個(gè)高層數(shù)據(jù)的URL的函數(shù),結(jié)果第二天,小伙伴告訴我說下載到x == 9, y == 0, z == 512的時(shí)候停止下載了。
探索
首先,根據(jù)上述代碼可以知道,z按照邏輯是不可能等于512的,所有開始懷疑是不是這個(gè)函數(shù)有問題,但是這么簡(jiǎn)單的函數(shù),怎么看都不應(yīng)該有問題啊。于是開始跟代碼,發(fā)現(xiàn)
if z is 2**x
處,x == 9, y == 0, z == 512時(shí),if后面居然返回的是False。我拿計(jì)算器算了好幾遍,確定自己不是在二次元后,開始懷疑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
然后自己寫了個(gè)小段子看看最大的可復(fù)用的int是多大
a = 0 b = 0 while a is b: a += 1 b += 1
最后發(fā)現(xiàn)最大是256。
小結(jié):
- ==比較操作符:用來比較兩個(gè)對(duì)象是否相等,value做為判斷因素;
- is同一性運(yùn)算符:比較判斷兩個(gè)對(duì)象是否相同,id做為判斷因素。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸
這篇文章主要介紹了python使用tcp實(shí)現(xiàn)局域網(wǎng)內(nèi)文件傳輸,文件包括文本,圖片,視頻等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
python中編寫config文件并及時(shí)更新的方法
在pytorch或者其他深度學(xué)習(xí)框架中,有許多超參數(shù)需要調(diào)整,包括learning_rate,training_data_path等,因此編寫一個(gè)config文件統(tǒng)一存放這些參數(shù),方便調(diào)用/查看/修改還是很有必要,這篇文章主要介紹了python中一種編寫config文件并及時(shí)更新的方法,需要的朋友可以參考下2023-02-02
python和opencv構(gòu)建運(yùn)動(dòng)檢測(cè)器的實(shí)現(xiàn)
這篇文章主要介紹了python和opencv構(gòu)建運(yùn)動(dòng)檢測(cè)器的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
python進(jìn)階教程之動(dòng)態(tài)類型詳解
這篇文章主要介紹了python進(jìn)階教程之動(dòng)態(tài)類型詳解,動(dòng)態(tài)類型是動(dòng)態(tài)語言的特性,本文對(duì)多種動(dòng)態(tài)類型應(yīng)用做了講解,需要的朋友可以參考下2014-08-08

