在說 is 和 == 的區別以前,咱們先理解下python的變量。python的變量和java的變量有很大的區別,由於一個是動態語言,另外一個是靜態語言。java
java的變量就像是個盒子,是把對象的地址裝進這個盒子內,就會有大的或者小的盒子。而python的變量像個便利貼,把他貼在哪一個地方均可以,不須要管數據類型,只要你喜歡就能夠。說太多沒有用,得用代碼體會下。python
a = 1
上面的代碼過程是先在內存中生成了一個int的對象,而後咱們把這個便利貼 a 貼在了上面,今後a變量就指向了這個對象。咱們還能夠看看下面這個。app
a = [1, 2] b = a b.append(3) print(a) # 結果[1, 2, 3]
這裏是把a貼在了一個列表上,而後又用b指向a,接着操做b可是卻打印了出了b的結果。這是由於a和b都是便利貼,都貼在了同一個列表上,因此操做一個的話,另一個也會變化。或者咱們能夠看看這兩個變量指向的對象是不是同於一個對象。函數
print(a is b) print(id(a), id(b)) # 結果True1461897824584 1461897824584
能夠看到,是相等的。spa
如今咱們再看看is和==之間的區別。咱們仍是先看一個例子。code
a = [1, 2, 3] b = [1, 2, 3] print(a is b) print(a == b)
你們能夠先猜猜結果是什麼。我以前說了python的變量就是個便利貼,[1, 2, 3]都是直接賦值給兩個變量,也就是說生成了兩個對象,因此a,b指向的對象不同。因此結果出來了,第一個是False,第二個是True。爲何呢?由於is比較的是對象相同不相同,可是==比較的是值相同不相同。若是打印兩個id值的話,顯然是不一樣的。對象
print(id(a), id(b)) # 結果1735698385160 1735679028936
可是這個呢?內存
a = 1 b = 1 print(a is b) print(id(a), id(b)) # 結果True1956929696 1956929696
爲何這個又相等了呢?這是由於python中有個intern機制。 rem
intern機制就是無論你建立了多少個相同的字符串,在python中都是會指向同一個對象的。這是爲了防止你不當心建立了多個相同對象而浪費大量內存甚至會發生擠爆內存的後果。有了這個理解,咱們再看看下面例子就容易得出答案了。字符串
a = 'str' b = 's' + 'tr' print(a is b) # 結果 True c = "hello world" d = "hello world" print(c is d) # 結果 True
再來到==的實際調用,在用==進行判斷的時候實際是調用魔法函數__eq__()來判斷他們的值是否相等的。
總的來講,咱們在判斷是不是同一個對象的時候就用is,不要用==,因此在判斷該對象是什麼類型的時候建議用is或者直接用isinstance()這個方法。
class Person(): pass p = Person() print(type(p) is Person) # 結果 True
爲何上面結果是True呢?這是由於咱們以前說過類自己也是個對象,用type()方法會指向該對象,又由於這個類,也就是對象是惟一的,因此結果就是True。
完畢!
ps:若是以爲文章不錯的話,歡迎隨手點贊轉發支持
掃描二維碼關注公衆號獲取更多資訊