งูหลามif x is not Noneหรือif not x is None?
TLDR: คอมไพเลอร์ bytecode แยกพวกเขาทั้งสองไปx is not None- if x is not Noneดังนั้นเพื่อประโยชน์ในการอ่านของการใช้งาน
การอ่าน
เราใช้ Python เพราะเราให้ความสำคัญกับสิ่งต่าง ๆ เช่นความสามารถในการอ่านของมนุษย์ความสามารถในการใช้งานและความถูกต้องของกระบวนทัศน์ที่หลากหลายของการเขียนโปรแกรมมากกว่าประสิทธิภาพ
Python ปรับให้เหมาะสมสำหรับการอ่านโดยเฉพาะอย่างยิ่งในบริบทนี้
แยกและรวบรวม Bytecode
การnot ผูกนั้นอ่อนแอกว่าisดังนั้นจึงไม่มีความแตกต่างทางตรรกะที่นี่ ดูเอกสารประกอบ :
โอเปอเรเตอร์isและis notทดสอบการระบุตัวตนของวัตถุ: x is yเป็นจริงถ้า x และ y เป็นวัตถุเดียวกัน x is not yให้ค่าความจริงผกผัน
is notมีให้เฉพาะสำหรับในหลามไวยากรณ์เป็นการปรับปรุงการอ่านภาษา:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
และมันก็เป็นองค์ประกอบที่รวมกันของไวยากรณ์เช่นกัน
แน่นอนว่ามันไม่ได้แยกวิเคราะห์เหมือนกัน:
>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"
แต่แล้วคอมไพเลอร์ไบต์จริงจะแปลnot ... isไปis not:
>>> import dis
>>> dis.dis(lambda x, y: x is not y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
1 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 COMPARE_OP 9 (is not)
9 RETURN_VALUE
is notดังนั้นเพื่อประโยชน์ของการอ่านและการใช้ภาษาที่ก็ตั้งใจใช้โปรด
ที่จะไม่ใช้มันไม่ฉลาด
is notเป็นผู้ดำเนินการที่ถูกต้อง กด!=ไลค์ ถ้าคุณต้องการnot x is Noneแล้วคุณยังจะชอบมากกว่าnot a == ba != b