Họ luôn đưa ra cùng một kết quả.
Trên thực tế, not 'ham' in 'spam and eggs'
dường như có xu hướng đặc biệt để thực hiện một thao tác "không tham gia", chứ không phải là một thao tác "trong" và sau đó phủ định kết quả:
>>> import dis
>>> def notin():
'ham' not in 'spam and eggs'
>>> dis.dis(notin)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not_in():
not 'ham' in 'spam and eggs'
>>> dis.dis(not_in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def not__in():
not ('ham' in 'spam and eggs')
>>> dis.dis(not__in)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 7 (not in)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE
>>> def noteq():
not 'ham' == 'spam and eggs'
>>> dis.dis(noteq)
2 0 LOAD_CONST 1 ('ham')
3 LOAD_CONST 2 ('spam and eggs')
6 COMPARE_OP 2 (==)
9 UNARY_NOT
10 POP_TOP
11 LOAD_CONST 0 (None)
14 RETURN_VALUE
Lúc đầu, tôi đã nghĩ rằng chúng luôn đưa ra cùng một kết quả, nhưng not
bản thân nó chỉ đơn giản là một toán tử phủ định logic có mức độ ưu tiên thấp, có thể được áp dụng cho a in b
dễ dàng như bất kỳ biểu thức boolean nào khác, trong khi đó not in
là một toán tử riêng biệt để thuận tiện và rõ ràng .
Sự tháo gỡ ở trên đã được tiết lộ! Có vẻ như mặc dù not
rõ ràng là một toán tử phủ định logic, nhưng biểu mẫu not a in b
này được viết tắt đặc biệt để nó không thực sự sử dụng toán tử chung. Điều này làm cho not a in b
biểu thức tương tự theo nghĩa đen a not in b
, thay vì chỉ là một biểu thức dẫn đến cùng một giá trị.
not x in xs
trong tài liệu.