Sự khác biệt giữa những gì là không có gì khác nhau


324

Gần đây tôi đã bắt gặp cú pháp này, tôi không biết về sự khác biệt.

Tôi sẽ đánh giá cao nếu ai đó có thể cho tôi biết sự khác biệt.



1
Điều này có trả lời câu hỏi của bạn không? Có sự khác biệt giữa "==" và "là" không?
6

Không rõ câu hỏi này là về isvs ==, hay về bản chất của chính xác Nonelà gì và hành vi khác nhau như thế nào trong cả hai bối cảnh (câu hỏi sau là lý do tại sao tôi kết thúc ở đây). Dựa trên sự mơ hồ và thiếu phản hồi của OP ... Tôi ngạc nhiên khi điều này có quá nhiều sự ủng hộ. Ý tôi là ... cmon ... câu hỏi thậm chí không được viết trong câu hỏi thực tế ...
RTbecard

Câu trả lời:


291

Câu trả lời được giải thích ở đây .

Để trích:

Một lớp có thể tự do thực hiện so sánh theo bất kỳ cách nào nó chọn và nó có thể chọn so sánh với Không có nghĩa là gì đó (điều này thực sự có ý nghĩa; nếu ai đó bảo bạn thực hiện đối tượng Không có từ đầu, bạn sẽ lấy nó như thế nào để so sánh Đúng chống lại chính nó?).

Thực tế mà nói, không có nhiều khác biệt vì các toán tử so sánh tùy chỉnh rất hiếm. Nhưng bạn nên sử dụng is Nonenhư một quy tắc chung.


57
Ngoài ra, is Nonenhanh hơn một chút (~ 50%) so với == None:)
Nas Banov

26
@ myusuf3: >>> timeit.Timer ('Không ai là Không'). timeit () | 0,225 | >>> timeit.Timer ('Không == Không'). timeit () | 0,328
Nas Banov

9
@ myusuf3 Bạn không thực sự cần một bằng chứng cho điều đó. isvề cơ bản, so sánh số nguyên trong khi ==không chỉ giải quyết các tham chiếu mà còn so sánh các giá trị có thể có các kiểu không khớp.
Pijusn

4
Một người ủng hộ "là". Khi một biến có thể là Không hoặc một cái gì đó không có so sánh có ý nghĩa với Không có. Ví dụ: một biến có thể là numpy.array hoặc Không (trường hợp cụ thể của tôi).
Jblasco

3
Tôi muốn thêm vào những gì @TimLudwinski đang nói: đầu tiên, nếu ai đó chọn ghi đè toán tử đẳng thức để biến Không thành trường hợp đặc biệt, tại sao chúng ta lại muốn nói với họ? Thứ hai, "Nên có một - và tốt nhất là chỉ có một cách - rõ ràng để làm điều đó." Và cách rõ ràng để kiểm tra xem một cái gì đó có bằng một cái gì đó hay không, là, toán tử đẳng thức.
Yuval

162
class Foo:
    def __eq__(self,other):
        return True
foo=Foo()

print(foo==None)
# True

print(foo is None)
# False

56

Trong trường hợp này, chúng giống nhau. Nonelà một đối tượng đơn lẻ (chỉ tồn tại một đối tượng None).

is kiểm tra xem đối tượng có phải là cùng một đối tượng hay không, trong khi == chỉ kiểm tra xem chúng có tương đương không.

Ví dụ:

p = [1]
q = [1]
p is q # False because they are not the same actual object
p == q # True because they are equivalent

Nhưng vì chỉ có một None, nên chúng sẽ luôn giống nhau và issẽ trả về True.

p = None
q = None
p is q # True because they are both pointing to the same "None"

17
Câu trả lời này không chính xác, như được giải thích trong câu trả lời của Ben Hoffstein bên dưới stackoverflow.com/questions/3257919/is-none-vs-none/ Lỗi . x == Nonecó thể đánh giá Truengay cả khi xkhông phải là Nonemột thể hiện của một số lớp với toán tử đẳng thức tùy chỉnh riêng của nó.
tối đa

5

Nếu bạn sử dụng numpy,

if np.zeros(3)==None: pass

sẽ cung cấp cho bạn lỗi khi numpy không so sánh yếu tố


3

Nó phụ thuộc vào những gì bạn đang so sánh với Không có. Một số lớp có các phương thức so sánh tùy chỉnh đối xử == Nonekhác nhau is None.

Cụ thể, đầu ra của a == None thậm chí không phải là boolean !! - một nguyên nhân thường xuyên của lỗi.

Đối với một ví dụ cụ thể, hãy lấy một mảng ==gọn gàng trong đó việc so sánh được thực hiện theo từng phần tử:

import numpy as np
a = np.zeros(3) # now a is array([0., 0., 0.])
a == None #compares elementwise, outputs array([False, False, False]), i.e. not boolean!!!
a is None #compares object to object, outputs False
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.