ในความคิดเห็นในคำถามนี้ฉันเห็นข้อความที่แนะนำให้ใช้
result is not None
VS
result != None
ฉันสงสัยว่าความแตกต่างคืออะไรและทำไมจึงมีข้อเสนอแนะถึงอีกข้อหนึ่ง
ในความคิดเห็นในคำถามนี้ฉันเห็นข้อความที่แนะนำให้ใช้
result is not None
VS
result != None
ฉันสงสัยว่าความแตกต่างคืออะไรและทำไมจึงมีข้อเสนอแนะถึงอีกข้อหนึ่ง
คำตอบ:
==
เป็นทดสอบความเท่าเทียมกัน ตรวจสอบว่าด้านขวาและด้านซ้ายเป็นวัตถุเท่ากันหรือไม่ (ตามวิธี__eq__
หรือ__cmp__
วิธี)
is
เป็นการทดสอบตัวตน ตรวจสอบว่าด้านขวาและด้านซ้ายเป็นวัตถุเดียวกันหรือไม่ ไม่มีการเรียกเมธอดเสร็จวัตถุไม่สามารถมีอิทธิพลต่อการis
ดำเนินการ
คุณสามารถใช้is
(และis not
) สำหรับ singletons เช่นNone
ที่คุณไม่สนใจเกี่ยวกับวัตถุที่อาจต้องการที่จะหลอกว่าเป็นหรือที่คุณต้องการที่จะป้องกันวัตถุที่จะหมดเมื่อมีการเปรียบเทียบกับNone
None
None
มีวิธีการเล็กน้อยและแทบไม่มีคุณสมบัติ หาก__eq__
การทดสอบของคุณคาดว่าจะมีวิธีการหรือคุณสมบัติ def __eq__( self, other ): return self.size == other.size
. ตัวอย่างเช่นถ้าจะทำลายที่จะเกิดขึ้นother
None
is
เป็นเหมือนของ ==
Java ธ==
เป็นเหมือนของ .equals()
Java หลักสูตรนี้จะช่วยได้ก็ต่อเมื่อคุณรู้จัก Java
is
มันเป็น===
(เท่ากันมาก) และในทางกลับกันis not
ก็เป็นเหมือน!==
(ไม่เท่ากันทั้งหมด)
is not
ผู้ประกอบการเดียวหรือเป็นเพียงกวนผลมาจากis
ภายในเช่นnot foo is bar
?
ก่อนอื่นให้ฉันพูดมากกว่าสองสามคำ หากคุณต้องการคำตอบให้เลื่อนลงไปที่ "ตอบคำถามของคุณ"
เอกลักษณ์ของวัตถุ : เมื่อคุณสร้างวัตถุคุณสามารถกำหนดให้กับตัวแปร จากนั้นคุณสามารถกำหนดให้ตัวแปรอื่น เเละอีกอย่าง.
>>> button = Button()
>>> cancel = button
>>> close = button
>>> dismiss = button
>>> print(cancel is close)
True
ในกรณีนี้cancel
, close
และdismiss
ทั้งหมดหมายถึงวัตถุเดียวกันในหน่วยความจำ คุณสร้างButton
วัตถุเดียวเท่านั้นและตัวแปรทั้งสามอ้างถึงวัตถุนี้ เรากล่าวว่าcancel
, close
และdismiss
ทั้งหมดให้ดูที่เหมือนวัตถุ; นั่นคือพวกเขาอ้างถึงวัตถุหนึ่งเดียว
ความเท่าเทียมกันของวัตถุ : เมื่อคุณเปรียบเทียบสองวัตถุที่คุณมักจะไม่สนใจว่ามันหมายถึงการที่แน่นอนวัตถุเดียวกันในหน่วยความจำ ด้วยความเสมอภาคของวัตถุคุณสามารถกำหนดกฎของคุณเองสำหรับการเปรียบเทียบวัตถุสองชนิด เมื่อคุณเขียนคุณจะได้เป็นหลักบอกว่าif a == b:
if a.__eq__(b):
สิ่งนี้ช่วยให้คุณกำหนด__eq__
วิธีการa
เพื่อให้คุณสามารถใช้ตรรกะการเปรียบเทียบของคุณเอง
เหตุผล:วัตถุสองรายการมีข้อมูลเหมือนกัน แต่ไม่เหมือนกัน (ไม่ใช่วัตถุเดียวกันในหน่วยความจำ) ตัวอย่าง:สตริง
>>> greeting = "It's a beautiful day in the neighbourhood."
>>> a = unicode(greeting)
>>> b = unicode(greeting)
>>> a is b
False
>>> a == b
True
หมายเหตุ: ฉันใช้สตริง Unicode ที่นี่เพราะ Python ฉลาดพอที่จะใช้สตริงปกติโดยไม่ต้องสร้างสตริงใหม่ในหน่วยความจำ
ที่นี่ผมมีสองสาย Unicode, และa
b
พวกเขามีเนื้อหาเดียวกันแน่นอน แต่พวกเขาไม่ใช่วัตถุเดียวกันในหน่วยความจำ อย่างไรก็ตามเมื่อเราเปรียบเทียบพวกเขาเราต้องการให้พวกเขาเปรียบเทียบเท่ากัน สิ่งที่เกิดขึ้นที่นี่คือวัตถุ Unicode ได้ใช้__eq__
วิธีการ
class unicode(object):
# ...
def __eq__(self, other):
if len(self) != len(other):
return False
for i, j in zip(self, other):
if i != j:
return False
return True
หมายเหตุ: __eq__
เปิดunicode
ใช้งานอย่างมีประสิทธิภาพมากกว่านี้แน่นอน
เหตุผล:วัตถุสองชิ้นมีข้อมูลต่างกัน แต่ถือว่าเป็นวัตถุเดียวกันหากข้อมูลสำคัญบางอย่างเหมือนกัน ตัวอย่าง:ข้อมูลโมเดลส่วนใหญ่
>>> import datetime
>>> a = Monitor()
>>> a.make = "Dell"
>>> a.model = "E770s"
>>> a.owner = "Bob Jones"
>>> a.warranty_expiration = datetime.date(2030, 12, 31)
>>> b = Monitor()
>>> b.make = "Dell"
>>> b.model = "E770s"
>>> b.owner = "Sam Johnson"
>>> b.warranty_expiration = datetime.date(2005, 8, 22)
>>> a is b
False
>>> a == b
True
ที่นี่ผมมีสองหน้าจอ Dell, และa
b
พวกเขามียี่ห้อและรุ่นเดียวกัน อย่างไรก็ตามพวกเขาไม่มีข้อมูลเดียวกันหรือเป็นวัตถุเดียวกันในหน่วยความจำ อย่างไรก็ตามเมื่อเราเปรียบเทียบพวกเขาเราต้องการให้พวกเขาเปรียบเทียบเท่ากัน สิ่งที่เกิดขึ้นที่นี่คือวัตถุ Monitor ใช้__eq__
วิธีการ
class Monitor(object):
# ...
def __eq__(self, other):
return self.make == other.make and self.model == other.model
เมื่อเทียบกับใช้เสมอNone
is not
ไม่มี singleton ใน Python มีอินสแตนซ์เดียวเท่านั้นในหน่วยความจำ
โดยการเปรียบเทียบตัวตนนี้สามารถทำได้อย่างรวดเร็ว Python ตรวจสอบว่าวัตถุที่คุณอ้างถึงมีที่อยู่หน่วยความจำเดียวกันกับวัตถุไม่มีทั่วโลกหรือไม่ - การเปรียบเทียบตัวเลขสองจำนวนอย่างรวดเร็วมาก
โดยการเปรียบเทียบความเท่าเทียมกัน Python จะต้องค้นหาว่าวัตถุของคุณมี__eq__
วิธีการหรือไม่ หากไม่เป็นเช่นนั้นมันจะตรวจสอบซูเปอร์คลาสแต่ละรายการที่กำลังมองหา__eq__
วิธีการ ถ้ามันพบหนึ่ง Python เรียกมันว่า นี้จะไม่ดีโดยเฉพาะอย่างยิ่งถ้าเป็นวิธีการที่ช้าและไม่ได้กลับทันทีเมื่อมันสังเกตเห็นว่าวัตถุอื่น__eq__
ๆNone
คุณไม่ได้ใช้งาน__eq__
หรือไม่? จากนั้นงูหลามอาจจะหา__eq__
วิธีการobject
และใช้สิ่งนั้นแทน - เพียงแค่ตรวจสอบตัวตนของวัตถุอยู่แล้ว
เมื่อเปรียบเทียบกับสิ่งอื่น ๆ !=
มากที่สุดในหลามคุณจะใช้
พิจารณาสิ่งต่อไปนี้:
class Bad(object):
def __eq__(self, other):
return True
c = Bad()
c is None # False, equivalent to id(c) == id(None)
c == None # True, equivalent to c.__eq__(None)
None
.__eq__()
เป็นซิงเกิลจึงเปรียบเทียบตัวตนมักจะทำงานในขณะที่วัตถุสามารถปลอมเปรียบเทียบความเท่าเทียมกันผ่านทาง
None
แต่พฤติกรรมที่ไม่ถูกต้องNone
อาจเกิดขึ้นได้ซึ่งเป็นผลข้างเคียงของการใช้ความเท่าเทียมกับประเภทอื่น มันไม่ได้เกี่ยวข้องกับความปลอดภัยมากนักเพราะมันเป็นเพียงนัยที่ถูกต้อง
>>> () คือ () จริง >>> 1 คือ 1 จริง >>> (1,) == (1,) จริง >>> (1,) คือ (1,) เท็จ >>> a = (1,) >>> b = a >>> a คือ b จริง
วัตถุบางอย่างมี singletons และทำให้กับพวกเขาคือการเทียบเท่าis
==
ส่วนใหญ่ไม่ได้
()
และ1
ไม่ได้เป็นโสดเดี่ยว
-NSMALLNEGINTS <= n <= NSMALLPOSINTS
) และ tuples ที่ว่างเปล่าคือ singletons อันที่จริงมันไม่ได้เป็นเอกสารหรือรับประกัน แต่ก็ไม่น่าจะเปลี่ยนแปลง