อะไรคือความแตกต่างระหว่าง“ คือไม่มี” และ“ == ไม่มี”


324

ฉันเพิ่งเจอไวยากรณ์นี้ฉันไม่ได้ตระหนักถึงความแตกต่าง

ฉันจะขอบคุณถ้ามีคนบอกความแตกต่าง




มันไม่ชัดเจนว่าคำถามนี้เกี่ยวกับisvs ==หรือเกี่ยวกับลักษณะของสิ่งที่Noneเป็นและวิธีการที่พฤติกรรมแตกต่างในบริบทใด (หลังคือทำไมฉันลงเอยที่นี่) ขึ้นอยู่กับความคลุมเครือและการไม่มีคำตอบ OP ... ฉันประหลาดใจที่มี upvotes มากมาย ฉันหมายถึง ... cmon ... คำถามนั้นไม่ได้ถูกเขียนในคำถามจริง ...
RTbecard

คำตอบ:


291

คำตอบจะมีการอธิบายที่นี่

อ้าง:

คลาสมีอิสระในการใช้การเปรียบเทียบในทุกทางที่เลือกและสามารถเลือกเปรียบเทียบกับ None หมายถึงบางสิ่ง (ซึ่งเหมาะสมจริง ๆ ถ้ามีคนบอกให้คุณใช้วัตถุไม่มีตั้งแต่เริ่มต้นคุณจะเปรียบเทียบกับ True ได้อย่างไร กับตัวเอง?)

การพูดจริงแทบไม่แตกต่างกันมากนักเนื่องจากตัวดำเนินการเปรียบเทียบแบบกำหนดเองนั้นหายาก แต่คุณควรใช้is Noneเป็นกฎทั่วไป


57
นอกจากนี้ยังis Noneเป็นบิต (~ 50%) เร็วกว่า== None:)
นา Banov

26
@ myusuf3: >>> timeit.Timer ('ไม่มีคือไม่มี'). timeit () | 0.225 | >>> timeit.Timer ('ไม่มี == ไม่มี'). timeit () | 0.328
Nas Banov

9
@ myusuf3 คุณไม่จำเป็นต้องมีข้อพิสูจน์สำหรับเรื่องนี้ isโดยทั่วไปแล้วการเปรียบเทียบจำนวนเต็มในขณะที่==ไม่เพียง แต่แก้ไขการอ้างอิง แต่การเปรียบเทียบค่าที่อาจมีประเภทไม่ตรงกัน
Pijusn

4
หนึ่งในความโปรดปรานของ "คือ" เมื่อตัวแปรสามารถเป็น None หรือสิ่งที่ไม่มีการเปรียบเทียบที่มีความหมายกับ None ตัวอย่างเช่นตัวแปรอาจเป็น numpy.array หรือ None (กรณีของฉันโดยเฉพาะ)
Jblasco

3
ฉันต้องการเพิ่มสิ่งที่ @TimLudwinski พูด: ก่อนอื่นถ้ามีคนเลือกที่จะแทนที่ตัวดำเนินการความเท่าเทียมกันเพื่อให้ไม่มีกรณีพิเศษทำไมเราต้องการบอกพวกเขาเป็นอย่างอื่น? ประการที่สอง "ควรมีอย่างใดอย่างหนึ่ง - โดยเฉพาะอย่างยิ่งวิธีการที่ชัดเจนเท่านั้นที่จะทำ" และวิธีการที่ชัดเจนในการตรวจสอบว่าบางสิ่งบางอย่างเท่ากับสิ่งใดสิ่งหนึ่งคือผู้ดำเนินการความเท่าเทียม
Yuval


56

ในกรณีนี้พวกเขาเหมือนกัน Noneเป็นวัตถุซิงเกิล (มีเพียงหนึ่งเดียวที่เคยมีอยู่None)

is ตรวจสอบว่าวัตถุนั้นเป็นวัตถุเดียวกันหรือไม่ในขณะที่ == เพียงตรวจสอบว่าวัตถุนั้นเทียบเท่าหรือไม่

ตัวอย่างเช่น:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

แต่เนื่องจากมีเพียงรายการเดียวNoneจึงจะเหมือนกันเสมอและisจะส่งคืน True

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
คำตอบนี้ไม่ถูกต้องตามที่อธิบายไว้ในคำตอบของเบน Hoffstein ด้านล่างstackoverflow.com/questions/3257919/is-none-vs-none/... x == NoneอาจประเมินถึงTrueแม้ว่าxจะไม่ใช่Noneแต่เป็นอินสแตนซ์ของบางคลาสที่มีตัวดำเนินการความเสมอภาคแบบกำหนดเองของตัวเอง
สูงสุด

5

ถ้าคุณใช้จำนวนมาก

if np.zeros(3)==None: pass

จะทำให้คุณเกิดข้อผิดพลาดเมื่อ numpy ทำการเปรียบเทียบแบบตามองค์ประกอบ


3

ขึ้นอยู่กับสิ่งที่คุณเปรียบเทียบกับไม่มี บางคนเรียนมีวิธีการเปรียบเทียบที่กำหนดเองที่รักษาที่แตกต่างจาก== Noneis None

โดยเฉพาะอย่างยิ่งการส่งออกของa == None ไม่จำเป็นต้องเป็นแบบบูล !! - สาเหตุที่พบบ่อยของข้อบกพร่อง

สำหรับตัวอย่างเฉพาะให้ใช้อาร์เรย์ numpy ที่การ==เปรียบเทียบถูกนำมาใช้ในแบบตามลำดับ:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.