Trăn if x is not Nonehay 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ử isvà is notkiể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 ymang lại giá trị thật ngược.
Điều is notnà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 ... issang 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 notlà 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 Nonethì bạn cũng nên thíchnot a == bhơna != b.