2017-06-15 83 views
4

檢查Python中的slice類與dir(),我看到它具有屬性__le____lt__。事實上,我看到下面的代碼工作:在python中比較切片

slice(1, 2) < slice(3, 4) 
# True 

但是,我看不出哪個邏輯實施此比較,也不是它的用例。任何人都可以指出我的意思嗎?

我不是在問元組比較。即使切片和元組以相同的方式進行比較,我不認爲這使我的問題重複。更重要的是,我還要求提供可能的片段比較用例,建議的副本沒有給出。

+3

這不是重複的。我在問切片,而不是元組。 –

回答

3

看着爲slice的源代碼顯示,比較由第一兩個對象轉換爲(start, stop, step)元組,然後比較這些元組實現:

https://github.com/python/cpython/blob/6cca5c8459cc439cb050010ffa762a03859d3051/Objects/sliceobject.c#L598

至於使用的情況下,我不確定作者的意圖。我注意,不要顯得比其他相等的任何東西比較單元測試:

https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/test/test_slice.py#L87

2

比較元組:(1, 2) < (3, 4)返回True,因爲(1, 2) comes before (3, 4)

但是,(1, 2) < (0, 4)返回False,因爲(1, 2) comes after (0, 4)

注:<>並不意味着smaller thangreater than,但is beforeis after

所以,換句話說,你正在comapring哪些是之前和哪些是後來。

一些「奇數」的情況下(或者,內<誤導例和>):

(1, 2) < (3, 4, 5)返回True因爲第一元組的缺失值將等於它是一個零在操作的nil值這個案例。或者你可以認爲它是(1, 2) come before (3, 4, 5)

和:

(0, 1) < (1, 0)將返回True因爲(0, 1) comes before (1, 0)

另一種情況:

(0, 1, 20000) < (0, 3, 1)將返回True因爲(0, 1, 20000) comes before (0, 3, 1)

slicelist甚至strings的邏輯相同。

欲瞭解更多信息,請訪問answer

+1

關於你的「小於」評論,我確實認爲lt和le表示「小於等於或小於等於」。你確認嗎? –

+0

是的,我確認了。 '__lt__'的行爲與'<'相同。 '<='和'__le__'是相同的。 –

+0

2

Python data model只提到切片對象有三個只讀屬性和一個方法。它沒有提及切片的其他屬性。

正如@NPE所提到的,CPython的實現確實是provides slice對象的比較,它簡單地將slice作爲(start, end, step)的元組對待。我用一個小的Python程序檢查了它,確認:

vals = [] 
for a in range(-5, 5): 
    for b in range(-5, 5): 
     for c in range(-5, 5): 
      vals.append((a, b, c)) 
for x in vals: 
    for y in vals: 
     assert (slice(*x) < slice(*y)) == (x < y) 

但是,這看起來像一個非標準的擴展。例如,Jython也實現了對切片的比較,但採用不同的方式。此外,它看起來像implements比較所有可能的對象對,通過比較相同類型的對象ids,傳播到切片。

所以,Jython中的片的順序是非確定性的。例如,下面的代碼片段打印True True我的Jython的系統上,並True False與CPython的:

print(slice(1, 2) < slice(1, 3)) 
print(slice(1, 3) < slice(1, 2)) 

彙總:__lt__在CPython的實現對於一些模糊的原因,但它不是在文檔中任何地方所述和其他實現的行爲可能不只有不同,但「不正確」(在mathematical sense)。所以,人們不應該比較不平等的切片。