檢查Python中的slice
類與dir()
,我看到它具有屬性__le__
和__lt__
。事實上,我看到下面的代碼工作:在python中比較切片
slice(1, 2) < slice(3, 4)
# True
但是,我看不出哪個邏輯實施此比較,也不是它的用例。任何人都可以指出我的意思嗎?
我不是在問元組比較。即使切片和元組以相同的方式進行比較,我不認爲這使我的問題重複。更重要的是,我還要求提供可能的片段比較用例,建議的副本沒有給出。
檢查Python中的slice
類與dir()
,我看到它具有屬性__le__
和__lt__
。事實上,我看到下面的代碼工作:在python中比較切片
slice(1, 2) < slice(3, 4)
# True
但是,我看不出哪個邏輯實施此比較,也不是它的用例。任何人都可以指出我的意思嗎?
我不是在問元組比較。即使切片和元組以相同的方式進行比較,我不認爲這使我的問題重複。更重要的是,我還要求提供可能的片段比較用例,建議的副本沒有給出。
看着爲slice
的源代碼顯示,比較由第一兩個對象轉換爲(start, stop, step)
元組,然後比較這些元組實現:
至於使用的情況下,我不確定作者的意圖。我注意,不要顯得比其他相等的任何東西比較單元測試:
比較元組:(1, 2) < (3, 4)
返回True
,因爲(1, 2) comes before (3, 4)
。
但是,(1, 2) < (0, 4)
返回False
,因爲(1, 2) comes after (0, 4)
。
注:<
和>
並不意味着smaller than
或greater than
,但is before
和is 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)
。
slice
,list
甚至strings
的邏輯相同。
欲瞭解更多信息,請訪問answer。
關於你的「小於」評論,我確實認爲lt和le表示「小於等於或小於等於」。你確認嗎? –
是的,我確認了。 '__lt__'的行爲與'<'相同。 '<='和'__le__'是相同的。 –
和
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比較所有可能的對象對,通過比較相同類型的對象id
s,傳播到切片。
所以,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)。所以,人們不應該比較不平等的切片。
這不是重複的。我在問切片,而不是元組。 –