2013-08-16 38 views
6

Tôi đã (có thể sai) nghĩ rằng nhà điều hành is đang thực hiện so sánh id().Toán tử 'is' làm gì trong Python?

>>> x = 10 
>>> y = 10 
>>> id(x) 
1815480092 
>>> id(y) 
1815480092 
>>> x is y 
True 

Tuy nhiên, với val is not None, có vẻ như nó không đơn giản như vậy.

>>> id(not None) 
2001680 
>>> id(None) 
2053536 
>>> val = 10 
>>> id(val) 
1815480092 
>>> val is not None 
True 

Sau đó, nhà điều hành 'là' làm gì? Nó chỉ là đối tượng id so sánh chỉ tôi phỏng đoán? Nếu vậy, val is not None được diễn giải bằng Python là not (val is None)?

+0

Có, 'val không phải là None' và' không (val là Không) 'là [tương đương] (http://stackoverflow.com/questions/12941287/does-not-e-in-c-differ-từ -e-not-in-c-in-python). Nhưng cái đầu tiên là IMO dễ đọc hơn. –

Trả lời

10

Bạn đã bỏ lỡ is not là nhà điều hành quá.

Without is, các not điều hành thường xuyên trả về một boolean:

>>> not None 
True 

not None là như vậy, 'giá trị' boolean nghịch đảo của None. Trong một bối cảnh boolean None là sai:

>>> bool(None) 
False 

nên not None là boolean True.

Cả NoneTrue là những đối tượng quá, và cả hai đều có một địa chỉ bộ nhớ (giá trị id() lợi cho việc thực hiện CPython của Python):

>>> id(True) 
4440103488 
>>> id(not None) 
4440103488 
>>> id(None) 
4440184448 

is kiểm tra nếu hai tài liệu tham khảo được trỏ đến cùng một đối tượng ; nếu một cái gì đó là cùng một đối tượng, nó sẽ có cùng một id() là tốt. is trả về giá trị boolean, True hoặc False.

is not là nghịch đảo của toán tử is. Nó tương đương với not (op1 is op2), trong một toán tử. Cần không được đọc như op1 is (not op2) đây:

>>> 1 is not None  # is 1 a different object from None? 
True 
>>> 1 is (not None) # is 1 the same object as True? 
False 
+0

Điều quan trọng cần lưu ý là 'không phải' là một toán tử đơn. 'Đúng là (không phải 1) -> Sai',' Đúng là không 1 -> True'. Vì vậy, những gì 'không None' trả về là không thích hợp. –

+0

@PavelAnossov Giá trị trả về của 'không None' có liên quan bởi vì OP đã sử dụng' (không phải là None) 'trong một ví dụ. – delnan

+0

@delnan: chính xác, vì rõ ràng OP đã bỏ lỡ rằng 'không phải là' là một toán tử đơn. Có vẻ như 'op1 is (not None)' được mong đợi. Mà sẽ là 'Sai', không phải' True'. –

3

Là một bổ sung cho Martijn Pieters câu trả lời, None, TrueFalse đang độc thân. Chỉ có một thể hiện của mỗi người trong số các giá trị nên nó là an toàn để sử dụng is để kiểm tra chúng ..

>>> id(True) 
8851952 
>>> id(False) 
8851920 
>>> id(None) 
8559264 
>>> id(not None) 
8851952 
>>> id(1 == 0) 
8851920 
>>> id(1 == 1) 
8851952 
+0

Đối với 'Không có', tôi đồng ý, đối với' False' và 'True', đó có thể là chi tiết triển khai. Tuy nhiên, kiểm tra 'if xxx là True:' âm thanh ngớ ngẩn với tôi; một 'if xxx:' chỉ nên tốt hơn. – glglgl

+0

@glglgl Tôi đồng ý. Tôi vừa giới thiệu 'True' và' False' trong cuộc thảo luận như câu hỏi ban đầu được đề cập đến là 'is (not None) '. Tức là, sử dụng toán tử 'is' để so sánh với giá trị boolean' (không None) '- không giống như sử dụng toán tử' is', như được giải thích trong các chú thích khác. –

+0

@glglgl bạn có thể dễ dàng tìm ra trường hợp bệnh lý cho 'xxx là True': mã lỗi được trả lại, theo cách của các quy trình linux. Nếu một hàm thành công, nó trả về True, nếu nó không thành công, nó trả về một mã lỗi, có thể lớn hơn 0, và do đó cũng sẽ đánh giá đúng. Phải thừa nhận rằng, có nhiều cách tốt hơn để làm điều này, nhưng chúng tôi đang được bệnh lý ở đây. (Phải thừa nhận rằng ở trên có ý nghĩa hơn đối với người đọc hơn là kết quả cần thiết nếu kết quả: 'với sự không thành công của linux-esque.) – RoadieRich

0

Python cố gắng bắt chước cú pháp ngôn ngữ tiếng Anh để làm cho nó con người dễ đọc hơn, nhưng trong trường hợp này các nhà điều hành ưu tiên là một chút bối rối.

>>> val is not None 
True 

Trong tiếng Anh, chúng tôi yêu cầu nếu val không có giá trị được đại diện bởi cùng một đối tượng là None. Trong ví dụ trên val=10, do đó, câu trả lời là (chính xác) True.

Tuy nhiên, từ một logic, quan điểm cú pháp bạn đã chia nhỏ các tuyên bố word-cho-word và giả định nó là:

>>> val is (not None) 
False 

mà khi kèm theo trong patentheses thích hợp, trả về kết quả dự kiến ​​của bạn (False).

Khi @Martijn Pieters chỉ ra, is notis an operator in its own right và là toán tử duy nhất hoạt động tại đây.

Nếu bạn muốn viết nó như một tuyên bố không mơ hồ chỉ sử dụng các nhà khai thác mà không chứa dấu cách, bạn có thể viết:

>>> not (val is None) 
True 

Nhưng đó không phải là cách bạn sẽ 'nói' tuyên bố dự định bằng tiếng Anh, hoặc thậm chí có thể viết nó trong mã giả.

Các vấn đề liên quan