2010-04-05 41 views

Trả lời

40

x is y khác với x == y.

x is y là đúng nếu và chỉ nếu id(x) == id(y) - đó là, xy phải là một và cùng một đối tượng (với cùng id s).

Đối với tất cả các đối tượng Python tích hợp (như chuỗi, danh sách, dicts, chức năng, v.v.), nếu x is y, thì x == y cũng là True. Tuy nhiên, điều này không được đảm bảo nói chung. Nói đúng ra, x == y là đúng nếu và chỉ khi x.__eq__(y) trả về Đúng.

Có thể xác định đối tượng x với phương pháp __eq__ luôn trả về False, ví dụ và điều này sẽ gây ra x == y để trả về False, ngay cả khi x is y.

Vì vậy, dòng dưới cùng là, x is yx == y là các thử nghiệm hoàn toàn khác nhau.

Xem xét việc này ví dụ:

In [1]: 0 is False 
Out[1]: False 

In [2]: 0 == False 
Out[2]: True 

PS. Thay vì

if x is y: 
    return True 
else: 
    return False 

nó là nhiều Pythonic viết

return x is y 

Và tương tự,

if x == y: 
    return True 
else: 
    return False 

có thể được thay thế bằng

return x == y 
+0

Điều đó thực sự hữu ích. Cảm ơn bạn! – ensnare

+0

@ensnare: Không sao cả! Mừng vì tôi có thể giúp. – unutbu

+7

Tôi là một chút cầu kỳ, nhưng nó không chính xác mà bạn cần 'x == y' là đúng trước khi' x là y' có thể đúng. Họ là những thử nghiệm độc lập. Phải thừa nhận rằng trong thực tế, bạn sẽ khó có thể tìm được ví dụ phản biện hợp lý, nhưng phương thức đặc biệt '__eq__' chỉ có thể trả về' False' hoặc tăng một ngoại lệ. –

4

Phụ thuộc. isis not so sánh danh tính, tốt cho None, Ellipsis hoặc đảm bảo rằng hai đối tượng giống nhau. Nếu không, hãy sử dụng == hoặc !=.

15

x is y so sánh bản sắc của hai các đối tượng và đang yêu cầu 'là xy các tên khác nhau cho cùng một đối tượng?' Nó tương đương với id(x) == id(y).

x == y sử dụng toán tử bình đẳng và hỏi câu hỏi lỏng lẻo 'là xy bằng nhau?' Đối với các loại do người dùng xác định, nó tương đương với x.__eq__(y).

Phương thức đặc biệt __eq__ phải đại diện cho 'bằng nhau' cho các đối tượng, ví dụ: một lớp đại diện phân số sẽ muốn 1/2 bằng 2/4, mặc dù đối tượng 'một nửa' không thể có cùng một danh tính đối tượng 'hai phần tư'.

Lưu ý rằng không chỉ có trường hợp a == b không ngụ ý a is b mà còn ngược lại là đúng. Một là không nói chung một yêu cầu nghiêm ngặt hơn so với khác. Vâng, điều này có nghĩa rằng bạn có thể có a == a trở False nếu bạn thực sự muốn, ví dụ:

>>> a = float('nan') 
>>> a is a 
True 
>>> a == a 
False 

Trên thực tế mặc dù isgần luôn luôn là một sự so sánh cụ thể hơn ==.

+6

Ví dụ phân số thực sự là tại chỗ, Great Scott. :) – tzot

9
  • ==!= là đối tượng giá trị toán tử so sánh
  • isis not là đối tượng sắc toán tử so sánh

như những người khác đã nói rồi, is (và is not) chỉ khi bạn thực sự chăm sóc rằng một cặp biến được đề cập đến chính xác cùng một đối tượng. trong hầu hết các trường hợp, bạn thực sự không quan tâm, vì vậy bạn sẽ sử dụng ==!=.

Tuy nhiên, những gì bạn có thể bắt đầu để ý, nếu bạn nhìn vào rất nhiều mã Python, là is (và is not) có nhiều khả năng được sử dụng khi so sánh với True, FalseNone. lý do chính cho điều này là các đối tượng đó là các bộ đơn, nghĩa là có chính xác một thể hiện của mỗi giá trị đó. tại sao lại là vấn đề đó? tốt, điều này dẫn đến một lý do khác ... tốc độ.

với ==!=, người phiên dịch phải kéo lên cả hai gọi đối tượng để làm một so sánh (kể họ đang như nhau hay không), trong khi isis not đơn giản chỉ kiểm tra các giá trị của các đối tượng mà chúng đang đề cập đến. với điều này đã nói, bạn có thể thấy rằng cặp sau sẽ hoạt động nhanh hơn vì bạn không phải tự tìm nạp đối tượng để thực hiện so sánh. đây là một thử nghiệm tốc độ từ một vài năm trở lại nơi chúng tôi kết luận rằng đối với một lần, nó không phải là một vấn đề lớn, nhưng nếu nó được gọi là một lần gazillion trong một vòng lặp chặt chẽ, tốt, nó sẽ bắt đầu tăng lên.

http://mail.python.org/pipermail/tutor/2008-June/062708.html

Điểm mấu chốt là bạn có thể sử dụng so sánh nhận dạng đối tượng cho kiểm tra đối với True, FalseNone, và mọi thứ khác nên sử dụng thẳng lên nhà khai thác bình đẳng. chúng tôi sẽ không nhận được vào số nguyên interned cũng như phương pháp dụ ràng buộc, hoặc bất cứ điều gì như thế ở đây. :-)

+0

Điểm tốt về so sánh với người độc thân. Về chủ đề tốc độ, cần lưu ý rằng 'if a == True:' chậm hơn 'if a is True:', nó sẽ chậm hơn 'if a:' (ít nhất là đối với các kiểu built-in trong các test của tôi)). Thường chỉ sử dụng 'a' hoặc' not a' là tùy chọn nhanh nhất mặc dù chúng không hoàn toàn giống ngữ nghĩa 'a là True' hoặc' a is None', v.v. –

+0

Vì vậy, so sánh ints, như '1 là 1' hoặc '1 == 1'? –

+0

altho chúng đều tương đương nhau khi sử dụng các int nhỏ (hiện tại) trong 'range (-5, 256)', không phải là số được công bố và có thể thay đổi trong bất kỳ bản phát hành nào, vì vậy an toàn hơn chỉ sử dụng '==' các trường hợp ngoại trừ 'None',' True' và 'False' (và có lẽ một số khác). – wescpy

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