งูหลาม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 == b
a != b