Trăn if x is not None
hay if not x is None
?
TLDR: Trình biên dịch mã byte phân tích cả hai thành x is not None
- vì vậy để dễ đọc, hãy sử dụng if x is not None
.
Dễ đọc
Chúng tôi sử dụng Python vì chúng tôi coi trọng những thứ như khả năng đọc của con người, khả năng sử dụng và tính chính xác của các mô hình lập trình khác nhau về hiệu suất.
Python tối ưu hóa cho khả năng đọc, đặc biệt là trong bối cảnh này.
Phân tích cú pháp và biên dịch mã byte
Các not
ràng buộc yếu hơn is
, vì vậy không có sự khác biệt logic ở đây. Xem tài liệu :
Các toán tử is
và is not
kiểm tra nhận dạng đối tượng: x is y
đúng khi và chỉ khi x và y là cùng một đối tượng. x is not y
mang lại giá trị thật ngược.
Điều is not
này được quy định cụ thể trong ngữ pháp Python như là một cải tiến dễ đọc cho ngôn ngữ:
comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Và do đó, nó là một yếu tố đơn nhất của ngữ pháp là tốt.
Tất nhiên, nó không được phân tích cú pháp giống nhau:
>>> 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())]))"
Nhưng sau đó trình biên dịch byte sẽ thực sự dịch not ... is
sang 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
Vì vậy, để dễ đọc và sử dụng ngôn ngữ như dự định, vui lòng sử dụng is not
.
Để không sử dụng nó là không khôn ngoan.
is not
là một nhà điều hành trong quyền riêng của mình. Thích!=
. Nếu bạn thíchnot x is None
thì bạn cũng nên thíchnot a == b
hơna != b
.