2012-05-17 38 views
12

Phần trích dẫn từ docs:Python 2.x giá trị để đổi lấy cmp

cmp(x, y)

So sánh hai đối tượng x và y và trả về một số nguyên theo kết quả. Giá trị trả lại là âm nếu x < y, không nếu x == y và hoàn toàn dương nếu x > y.

Tôi đã theo giả định rằng giá trị trả về luôn -1, 0, và 1 nhưng các tài liệu không rõ ràng nói rằng, chỉ nhắc đến zero và giá trị trả tích cực/tiêu cực.

Có bất kỳ trường hợp nào khi giá trị trả lại của cmp(x,y) không phải là -1, 0 hoặc 1?

+7

Đương nhiên, đáng lưu ý rằng việc sử dụng 'cmp()' được khuyên dùng, vì nó đã biến mất trong Python 3.x. –

Trả lời

11

Không, các tài liệu nói rõ ràng rằng yalues ​​có thể là bất kỳ thứ gì. Giá trị duy nhất được chỉ định là 0 nếu các đối tượng được so sánh bằng nhau. Đừng tin tưởng vào thực tế là bạn chỉ nhìn thấy các giá trị -1, 01, đó là một chi tiết thực hiện và có thể thay đổi *, vì vậy luôn luôn kiểm tra cho <> 0.

*: lưu ý - trên thực tế, nó sẽ không thực sự có cơ hội thay đổi, vì cmp đã biến mất trong pyhton3. sử dụng rich comparison để thay thế.

2

Chỉ 0 có thể dựa vào, mặc dù docstring cho list.sort là thú vị:

print list.sort.__doc__ 
L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; 
cmp(x, y) -> -1, 0, 1 

Nhưng trên thực tế, loại không thực sự áp đặt này trên chức năng của nó so sánh như có thể thấy ở đây:

def mycmp(a, b): 
    print "mycmp(): a - b = ", a - b 
    return a - b 

L = [50, 30, 20, 40, 70, 50] 

>>> L.sort(cmp=mycmp) 
mycmp(): a - b = -20 
mycmp(): a - b = -10 
mycmp(): a - b = 20 
mycmp(): a - b = 10 
mycmp(): a - b = -10 
mycmp(): a - b = 30 
mycmp(): a - b = 20 
mycmp(): a - b = 10 
mycmp(): a - b = -20 
mycmp(): a - b = 0 

>>> print L 
[20, 30, 40, 50, 50, 70] 

Chỉ để được quan tâm, nhưng rõ ràng là sort đang làm việc vui vẻ với các giá trị khác ngoài -1, 0 hoặc +1, vì vậy bạn cũng nên như vậy!

+1

http://docs.python.org/library/functions.html#sorted cho biết rằng các nội trang sắp xếp chấp nhận các hàm cmp có thể trả về kết quả là +, 0 hoặc -. –

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