可能在網上你經常能看到關于這個問題的答案和解析,但是依然有很多剛開始學習Python的人,不了解這個問題,也不知道為什么問這個問題時會暴露自己是“菜鳥”,這個問題就是:
“==”和“is”之間有什么區別?
“==”和“is”都是Python中的運算符。對于初學者,他們可能會把“a==b”解釋為“a等于b”,“aisb”也可以解釋為“a是b”。這可能就是初學者在Python中混淆“==”和“is”的原因。
在開始之前,我想先展示一些使用“==”和“is”的例子。
>>>a=5>>>b=5>>>a==bTrue>>>aisbTrue很簡單,對吧?a==b和aisb都返回了結果True。接下來我們看另一個示例:
>>>a=1000>>>b=1000>>>a==bTrue>>>aisbFalseWTF?!?從第一個示例到第二個示例的唯一變化就是a和b的值從5到1000。但是返回的結果在“==”和“is”已經不同。我們再看另一個示例:
>>>a=[]>>>b=[]>>>a==bTrue>>>aisbFalse下面是最后一個例子,看完是不是覺得自己的腦子要爆炸?
>>>a=1000>>>b=1000>>>a==bTrue>>>aisbFalse>>>a=b>>>a==bTrue>>>aisbTrue“==”的正式運算是相等,而“is”的運算是標識。一般使用“==”來比較兩個對象的值。“a==b”應解釋為“a的值是否等于b的值”。在上述所有示例中,a的值始終等于b的值(即使對于空列表示例也是如此)。因此,“a==b”始終為真。
在解釋身份之前,我需要先介紹id函數。我們可以使用id函數獲得對象的標識。這個身份在整個時間內對于此對象都是唯一且恒定的。此標識在整個時間內對該對象是唯一且不變的。你可以把它看作是這個對象的地址。如果兩個對象具有相同的標識,則它們的值也必須相同。
>>>id(a)2047616運算符“is”是比較兩個對象的標識是否相同。“aisb”的意思是“a的身份與b的身份相同”。
如果你知道“==”和“is”的實際含義,我們就可以開始研究上面的幾個示例了。
首先是第一個和第二個示例中的結果不同。顯示不同結果的原因是Python存儲了一個介于-5到256之間的整數的數組列表,每個整數具有固定的標識。當我們在此范圍內分配整數變量時,Python會將此變量的標識分配為數組列表內整數的整數。結果,對于第一個示例,由于a和b的標識都是從數組列表中獲得的,因此它們的標識當然是相同的,因此“aisb”為True。
>>>a=5>>>id(a)1450375152>>>b=5>>>id(b)1450375152但是一旦該變量的值超出該范圍,由于Python內部沒有具有該值的對象,因此Python將為此變量創建一個新的標識并將該值分配給該變量。如前所述,身份對于每個創建都是唯一的,因此,即使兩個變量的值相同,其身份也永遠不會相等。這就是為什么“aisb”在第二個例子結果為False。
>>>a=1000>>>id(a)12728608>>>b=1000>>>id(b)13620208PS:如果你打開了兩個控制臺,該值仍在該范圍內,那么你將獲得相同的標識。但是,如果該值不在該范圍內,則結果就會發生改變。
如果你理解了第一示例和第二示例之間的區別,就很容易理解第三示例的結果。由于Python不存儲“空列表”對象,因此Python創建了一個新對象并分配了“空列表”值。無論兩個列表為空還是元素相同,結果都是相同的。
>>>a=[1,10,100,1000]>>>b=[1,10,100,1000]>>>a==bTrue>>>aisbFalse>>>id(a)12578024>>>id(b)12578056接下來,我們轉到最后一個示例。第二個和最后一個示例之間的唯一區別是還有一行代碼a=b,正是這行代碼改變了變量a的命運。以下結果將告訴你真實原因:
>>>a=1000>>>b=2000>>>id(a)2047616>>>id(b)5034992>>>a=b>>>id(a)5034992>>>id(b)5034992>>>a2000>>>b2000如上所示,在a=b之后,a的身份更改為b的身份。a=b將b的身份分配給a。因此a和b具有相同的標識,因此a的值現在與b的值相同(即2000)。
最后一個示例告訴我們一個重要消息,即我們可能會無意中更改對象的值,而不會事先通知,尤其是當對象是列表時。
>>>a=[1,2,3]>>>id(a)5237992>>>b=a>>>id(b)5237992>>>a.append(4)>>>a[1,2,3,4]>>>b[1,2,3,4]在上面的示例中,由于a和b具有相同的標識,因此它們的值必須相同。所以,在將新元素添加到a之后,b的值也會受到影響。為避免這種情況,如果要將值從一個對象復制到另一個對象而不引用相同的標識,則所有***之一是在copy模塊中使用deepcopy。對于列表,我們還可以通過b=a[:]執行。
>>>importcopy>>>a=[1,2,3]>>>b=copy.deepcopy(a)>>>id(a)39785256>>>id(b)5237992使用[:]將元素復制到新變量。
>>>a=[1,2,3]>>>id(a)39785256>>>b=a[:]>>>id(b)23850216>>>a.append(4)>>>a[1,2,3,4]>>>b[1,2,3]看完以上內容,你是不是已經充分了解了兩者之間的不同?如果面試遇到這種問題,千萬別回答錯啦!
--END--
喜歡本文的同學記得轉發+點贊~
更多內容,歡迎大家關注我們的公眾號:為AI吶喊(weainahan)