摘要:在說(shuō)和的區(qū)別之前,我們先理解下的變量。的變量和的變量有很大的區(qū)別,因?yàn)橐粋€(gè)是動(dòng)態(tài)語(yǔ)言,另一個(gè)是靜態(tài)語(yǔ)言。結(jié)果可以看到,是相等的?,F(xiàn)在我們?cè)倏纯春椭g的區(qū)別。這是為了防止你不小心創(chuàng)建了多個(gè)相同對(duì)象而浪費(fèi)大量?jī)?nèi)存甚至?xí)l(fā)生擠爆內(nèi)存的后果。
在說(shuō) is 和 == 的區(qū)別之前,我們先理解下python的變量。python的變量和java的變量有很大的區(qū)別,因?yàn)橐粋€(gè)是動(dòng)態(tài)語(yǔ)言,另一個(gè)是靜態(tài)語(yǔ)言。
java的變量就像是個(gè)盒子,是把對(duì)象的地址裝進(jìn)這個(gè)盒子內(nèi),就會(huì)有大的或者小的盒子。而python的變量像個(gè)便利貼,把他貼在哪個(gè)地方都可以,不需要管數(shù)據(jù)類型,只要你喜歡就可以。說(shuō)太多沒(méi)有用,得用代碼體會(huì)下。
a?=?1
上面的代碼過(guò)程是先在內(nèi)存中生成了一個(gè)int的對(duì)象,然后我們把這個(gè)便利貼 a 貼在了上面,從此a變量就指向了這個(gè)對(duì)象。我們還可以看看下面這個(gè)。
a?= [1,?2] b?=?a b.append(3) print(a) # 結(jié)果[1,?2,?3]
這里是把a(bǔ)貼在了一個(gè)列表上,然后又用b指向a,接著操作b但是卻打印了出了b的結(jié)果。這是因?yàn)閍和b都是便利貼,都貼在了同一個(gè)列表上,所以操作一個(gè)的話,另外一個(gè)也會(huì)變化?;蛘呶覀兛梢钥纯催@兩個(gè)變量指向的對(duì)象是否是同于一個(gè)對(duì)象。
print(a?is?b) print(id(a), id(b)) # 結(jié)果True1461897824584?1461897824584
可以看到,是相等的。
現(xiàn)在我們?cè)倏纯磇s和==之間的區(qū)別。我們還是先看一個(gè)例子。
a?= [1,?2,?3] b?= [1,?2,?3] print(a?is?b) print(a?==?b)
大家可以先猜猜結(jié)果是什么。我之前說(shuō)了python的變量就是個(gè)便利貼,[1, 2, 3]都是直接賦值給兩個(gè)變量,也就是說(shuō)生成了兩個(gè)對(duì)象,所以a,b指向的對(duì)象不一樣。所以結(jié)果出來(lái)了,第一個(gè)是False,第二個(gè)是True。為什么呢?因?yàn)閕s比較的是對(duì)象相同不相同,但是==比較的是值相同不相同。如果打印兩個(gè)id值的話,顯然是不同的。
print(id(a),?id(b)) # 結(jié)果1735698385160?1735679028936
但是這個(gè)呢?
a =?1 b =?1 print(a?is?b) print(id(a), id(b)) # 結(jié)果True1956929696?1956929696
為什么這個(gè)又相等了呢?這是因?yàn)閜ython中有個(gè)intern機(jī)制。
intern機(jī)制就是不管你創(chuàng)建了多少個(gè)相同的字符串,在python中都是會(huì)指向同一個(gè)對(duì)象的。這是為了防止你不小心創(chuàng)建了多個(gè)相同對(duì)象而浪費(fèi)大量?jī)?nèi)存甚至?xí)l(fā)生擠爆內(nèi)存的后果。有了這個(gè)理解,我們?cè)倏纯聪旅胬泳腿菀椎贸龃鸢噶恕?/p>
a =?"str" b =?"s"?+?"tr" print(a?is?b)?# 結(jié)果 True c =?"hello world" d =?"hello world" print(c?is?d)?# 結(jié)果 True
再來(lái)到==的實(shí)際調(diào)用,在用==進(jìn)行判斷的時(shí)候?qū)嶋H是調(diào)用魔法函數(shù)__eq__()來(lái)判斷他們的值是否相等的。
總的來(lái)說(shuō),我們?cè)谂袛嗍欠袷峭粋€(gè)對(duì)象的時(shí)候就用is,不要用==,所以在判斷該對(duì)象是什么類型的時(shí)候建議用is或者直接用isinstance()這個(gè)方法。
class?Person(): pass p = Person() print(type(p)?is?Person) ?# 結(jié)果 True
為什么上面結(jié)果是True呢?這是因?yàn)槲覀冎罢f(shuō)過(guò)類本身也是個(gè)對(duì)象,用type()方法會(huì)指向該對(duì)象,又因?yàn)檫@個(gè)類,也就是對(duì)象是唯一的,所以結(jié)果就是True。
完畢!
ps:如果覺(jué)得文章不錯(cuò)的話,歡迎隨手點(diǎn)贊轉(zhuǎn)發(fā)支持
掃描二維碼關(guān)注公眾號(hào)獲取更多資訊
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42124.html
摘要:簡(jiǎn)述正則表達(dá)式是處理字符串的利器,并提高工作效率,一個(gè)好的正則能夠幫我們省去幾十甚至上百行代碼。 簡(jiǎn)述 正則表達(dá)式是處理字符串的利器,并提高工作效率,一個(gè)好的正則能夠幫我們省去幾十甚至上百行代碼。在工作中,也許你會(huì)見(jiàn)到在代碼中出現(xiàn)很多正則處理字符串,也可能見(jiàn)到代碼中毫無(wú)正則,原因在于會(huì)正則的人往往處理字符串首先想到用正則去處理,不會(huì)的那必然用很多API處理。并且在面試的時(shí)候很多同學(xué)往往...
摘要:大家好,在我們上一篇復(fù)習(xí)了的基礎(chǔ)和實(shí)用技巧后,今天我們來(lái)看一下里的邏輯關(guān)系,所謂邏輯關(guān)系無(wú)非就是如果就否則之類的,不是非常復(fù)雜,我的意思是復(fù)雜的地方不用目前了解,因?yàn)橐呀?jīng)超出了小白的水準(zhǔn),哈哈,閑話少說(shuō),讓我們一起來(lái)看看吧什么是里面用的形 大家好,在我們上一篇復(fù)習(xí)了dict的基礎(chǔ)和實(shí)用技巧后,今天我們來(lái)看一下Python里的邏輯關(guān)系,所謂邏輯關(guān)系無(wú)非就是如果...就...否則...之類...
摘要:在生產(chǎn)者與消費(fèi)者之間的緩沖區(qū)稱之為倉(cāng)庫(kù)。生產(chǎn)者負(fù)責(zé)往倉(cāng)庫(kù)運(yùn)輸商品,而消費(fèi)者負(fù)責(zé)從倉(cāng)庫(kù)里取出商品,這就構(gòu)成了生產(chǎn)者消費(fèi)者模式。中的多線程編程在實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式之前,我們先學(xué)習(xí)下中的多線程編程。 什么是生產(chǎn)者消費(fèi)者模式 在軟件開(kāi)發(fā)的過(guò)程中,經(jīng)常碰到這樣的場(chǎng)景:某些模塊負(fù)責(zé)生產(chǎn)數(shù)據(jù),這些數(shù)據(jù)由其他模塊來(lái)負(fù)責(zé)處理(此處的模塊可能是:函數(shù)、線程、進(jìn)程等)。產(chǎn)生數(shù)據(jù)的模塊稱為生產(chǎn)者,而處理數(shù)據(jù)...
閱讀 1082·2021-11-23 09:51
閱讀 2423·2021-09-29 09:34
閱讀 3164·2019-08-30 14:20
閱讀 1077·2019-08-29 14:14
閱讀 3193·2019-08-29 13:46
閱讀 1087·2019-08-26 13:54
閱讀 1645·2019-08-26 13:32
閱讀 1437·2019-08-26 12:23