2010-02-10 30 views
34

Có sử dụng toán tử "is" hoặc toán tử "==" để so sánh hai số trong Python không?Sử dụng "is" hoặc "==" để so sánh số trong Python có tốt hơn không?

Ví dụ:

>>> a = 1 
>>> a is 1 
True 
>>> a == 1 
True 
>>> a is 0 
False 
>>> a == 0 
False 
+0

http://stackoverflow.com/questions/1504717/python-vs-is-comparing-strings-is-fails-sometimes-why/1504742#1504742 – SilentGhost

+0

http: // stackoverflow.com/questions/2209755/python-operation-vs-is-không –

+0

Có thể trùng lặp của toán tử ["is" hoạt động bất ngờ với số nguyên] (https://stackoverflow.com/questions/306313/is-operator-behaves-unexpectedly- with-integers) –

Trả lời

64

Sử dụng ==.

Đôi khi, trên một số triển khai python, theo trùng hợp ngẫu nhiên, số nguyên từ -1 đến 256 sẽ hoạt động với is. Nhưng đừng dựa vào điều này hoặc sử dụng nó trong các chương trình thực sự.

+3

Các lớp xác định '__int__' sẽ không hoạt động đúng với' == 'một trong hai; họ cần phải xác định '__eq__' hoặc' __cmp__' :) –

+0

@Thomas: Đủ công bằng. Đã sửa. –

+2

Lý do cho việc này là Python tự động tạo ra các số nguyên trước khi chạy thay vì xây dựng chúng trên bay để tiết kiệm thời gian, và do đó các số nguyên cụ thể này có id trước khi được cần trong chương trình. –

9
>>> a = 255556 
>>> a == 255556 
True 
>>> a is 255556 
False 

Tôi nghĩ rằng nên trả lời nó ;-)

Nguyên nhân là do một số đối tượng thường được sử dụng, chẳng hạn như các phép toán luận True và False, tất cả 1- các chuỗi ký tự và các số ngắn được phân bổ một lần bởi trình thông dịch và mỗi biến chứa đối tượng đó đề cập đến nó. Các số khác và chuỗi lớn hơn được phân bổ theo yêu cầu. Ví dụ 255556 được phân bổ ba lần, mỗi khi một đối tượng khác được tạo ra. Và do đó, theo số is, chúng là không phải là giống nhau.

+1

Việc sử dụng an toàn duy nhất của 'là' để so sánh là đối tượng' None'. Và tôi cho rằng đối tượng '...'. –

+0

'is' sẽ hoạt động với tất cả các chuỗi, không chỉ các chuỗi 1 chữ cái. Điều này được gọi là thực thi chuỗi trong tài liệu Python. – sttwister

+2

@ujukatzel - Sai. Khi tôi chạy 'a = 'đây là một địa ngục của một chuỗi ký tự"; b = "đây là một địa ngục của một chuỗi"; a là b' tôi nhận được 'False' là kết quả. Python (cụ thể là CPython) chỉ thực tập một số chuỗi nhỏ. –

5

Điều đó sẽ chỉ hoạt động với số lượng nhỏ và tôi đoán nó cũng phụ thuộc vào việc triển khai thực hiện. Python sử dụng cùng một cá thể đối tượng cho các số nhỏ (iirc < 256), nhưng điều này thay đổi cho các số lớn hơn.

>>> a = 2104214124 
>>> b = 2104214124 
>>> a == b 
True 
>>> a is b 
False 

Vì vậy, bạn nên luôn sử dụng == để so sánh các số.

1

== là những gì bạn muốn, "là" chỉ xảy ra để làm việc trên các ví dụ của bạn.

0
>>> 2 == 2.0 
True 
>>> 2 is 2.0 
False 

Sử dụng ==

+2

Nó trở nên tồi tệ hơn. '-9 là -9' là' Sai' trong CPython! –

23

Những người khác đã trả lời câu hỏi của bạn, nhưng tôi sẽ đi vào chi tiết hơn một chút:

Python của is so sánh sắc - nó hỏi câu hỏi "này là một điều chính xác giống với điều này khác "(tương tự như == trong Java). Vì vậy, có một số lần khi sử dụng is có ý nghĩa - cách phổ biến nhất đang kiểm tra cho None. Ví dụ: foo is None. Nhưng, nói chung, nó không phải là những gì bạn muốn.

==, mặt khác, đặt câu hỏi "là điều này một cách hợp lý tương đương với điều này khác". Ví dụ:

>>> [1, 2, 3] == [1, 2, 3] 
True 
>>> [1, 2, 3] is [1, 2, 3] 
False 

Và điều này là đúng bởi vì các lớp học có thể xác định phương pháp họ sử dụng để kiểm tra sự bình đẳng:

>>> class AlwaysEqual(object): 
...  def __eq__(self, other): 
...   return True 
... 
>>> always_equal = AlwaysEqual() 
>>> always_equal == 42 
True 
>>> always_equal == None 
True 

Nhưng họ không có thể xác định phương pháp dùng để tính thử nghiệm (ví dụ, họ không thể ghi đè is).

+0

'is' không chính xác giống như' === 'của Javascript, hoặc ít nhất là không liên quan đến câu hỏi. Ví dụ, đối với tôi '2 ** 12 là 2 ** 12' là' Sai' (điều này phụ thuộc vào thực thi), nhưng trong Javascript 'Math.pow (2, 12) === Math.pow (2, 12) 'là' đúng '. –

+0

Ah, ya, đó là một điểm tốt! Đã cập nhật. –

0
import math 

def Compare(x,y): 
    if x==y: 
     print x," is equal to ",y 
    elif x>y: 
     print x," is grater than ",y 
    else: 
     print x," is less than ",y 

def App(): 
    print"Enter a number " 
    a = raw_input() 
    int(a) 
    print"Enter second value" 
    b = raw_input() 
    int(b) 
    Compare(a,b) 
+3

Vui lòng thêm một số chi tiết về mã của bạn –

+0

chắc chắn bạn cần 'a = int (a)' và 'b = int (b)'. Vì nó đứng chức năng của bạn sẽ được so sánh các chuỗi (không phải là số) và do đó có thể không cần thiết tạo ra các kết quả bạn có thể mong đợi. –

+1

Thêm giải thích thêm vào mã của bạn sẽ không bao giờ bị mất. – NSNoob

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