2010-10-19 8 views

Trả lời

632

là thành ngữ Pythonic để kiểm tra biến không được đặt thành None. Thành ngữ này có cách sử dụng cụ thể trong trường hợp declaring keyword functions with default parameters. is kiểm tra danh tính bằng Python. Vì có một và chỉ một thể hiện của None có trong một tập lệnh/chương trình Python đang chạy, is là phép thử tối ưu cho việc này. Là Johnsyweb points out, điều này được thảo luận trong PEP 8 trong "Đề xuất lập trình".

Còn về lý do này được ưa chuộng hơn

if not (val is None): 
    # ... 

này chỉ đơn giản là một phần của Zen of Python: "Độ khó tính." Python tốt thường gần tốt pseudocode.

+38

Ngoài ra, "không phải" có các semeantics đặc biệt được tạo cho mục đích này (nó không phải là hậu quả logic của cách biểu thức được xây dựng; "1 is (not None)" và "1 is not None" có hai kết quả khác nhau –

+13

+1: Tôi thích tham chiếu này - "Good Python thường gần với mã giả tốt" – legesh

+1

"not None" trả về True. Thú vị: – Ries

18

Một trong hai số sau, vì val có khả năng có thể thuộc loại xác định __eq__() để trả lại giá trị đúng khi được thông qua None.

+4

Đó là thay vì hèn nhát '__eq __() 'hành vi, và một cái gì đó tôi đã không được xem xét. Câu trả lời tốt cho việc bắt một trường hợp góc. – gotgenes

74

Từ, Lập trình khuyến nghị, PEP 8:

So sánh để độc thân như Không nên luôn luôn được thực hiện với 'là' hay 'không phải là', không bao giờ các nhà khai thác bình đẳng.

Ngoài ra, hãy cẩn thận khi viết "nếu x" khi bạn thực sự muốn nói "nếu x không phải là Không" - ví dụ: khi kiểm tra xem một biến hoặc đối số mặc định là Không có giá trị nào được đặt thành một số giá trị khác. Giá trị khác có thể có loại (chẳng hạn như vùng chứa) có thể sai trong ngữ cảnh boolean!

PEP 8 là đọc cần thiết cho bất kỳ lập trình viên Python nào.

+4

+1 cho "đọc cần thiết" - không biết về điều đó – user2314737

12

Đặt cược tốt nhất với các loại câu hỏi này là để xem chính xác những gì python làm. Các module dis là vô cùng thông tin:

>>> def f(val): 
... if val != None: 
...  return True 
... return False 
... 
>>> def g(val): 
... if not (val is None): 
...  return True 
... return False 
... 
>>> def h(val): 
... if val is not None: 
...  return True 
... return False 
... 
>>> import dis 
>>> dis.dis(f) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    3 (!=) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 
>>> dis.dis(g) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    9 (is not) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 
>>> dis.dis(h) 
    2   0 LOAD_FAST    0 (val) 
       3 LOAD_CONST    0 (None) 
       6 COMPARE_OP    9 (is not) 
       9 POP_JUMP_IF_FALSE  16 

    3   12 LOAD_GLOBAL    1 (True) 
      15 RETURN_VALUE 

    4  >> 16 LOAD_GLOBAL    2 (False) 
      19 RETURN_VALUE 

Lưu ý rằng hai trường hợp cuối cùng giảm xuống cùng một chuỗi các hoạt động (python đọc not (val is None) và sử dụng các nhà điều hành is not). Đầu tiên sử dụng toán tử != khi so sánh với Không.

Như đã chỉ ra bởi câu trả lời khác, sử dụng != khi so sánh với Không là một ý tưởng tồi

+0

Sự khác biệt giữa các lần so sánh 9 và 3 là gì? – evolvedmicrobe