2 回答

TA貢獻1803條經驗 獲得超3個贊
當提供負步長值時,Python 會交換開始值和停止值。此外,如果未提供開始值和停止值,則默認為序列的開頭和結尾。
給定 ,內置類型文檔的“通用序列操作”部分中的以下引用適用:s[i:j:k]
如果省略 i 或 j 或 None,它們將成為“結束”值(哪個結束取決于 k 的符號)。
關于它在引擎蓋下的工作方式,在CPython中有兩個用于處理列表下標的函數,list_subscript()
(用于閱讀)和list_ass_subscript()
(用于分配)。
在這兩個函數中,在驗證下標是否指定了切片后,將調用 PySlice_Unpack()
和 PySlice_AdjustIndices()
來提取和規范化開始和停止值。
啟動值處理
if (r->start == Py_None) { *start = *step < 0 ? PY_SSIZE_T_MAX : 0;
如果起始值為負,則起始值設置為最大可能值。None
然后,在 PySlice_AdjustIndices() 中
:
else if (*start >= length) { *start = (step < 0) ? length - 1 : length;
如果起始值大于列表的長度(這無疑是由于上面的賦值)并且步長值為負,則起始值設置為(即 指序列的長度)。length - 1
length
停止值處理
if (r->stop == Py_None) { *stop = *step < 0 ? PY_SSIZE_T_MIN : PY_SSIZE_T_MAX;
如果止損值為負,則停止值設置為盡可能小的值。None
然后,在 PySlice_AdjustIndices() 中
:
if (*stop < 0) { *stop = (step < 0) ? -1 : 0;
如果停止值為負(這是由于上面的賦值)并且步長值為負,則停止值設置為 -1。
因此,使用 的輸入,您最終會得到:string[::-1]
起始值:len(字符串) - 1
停止值:-1
步驟: -1

TA貢獻1851條經驗 獲得超3個贊
當負值作為 傳遞時,默認值為 和 反轉。 從“序列開始”更改為“序列結束”,并從“序列結束”更改為“序列開始”。如果它不這樣做,你在執行一個完整的切片時會遇到問題,因為任何切片的結尾都是獨占的; 會排除第一個字符(因為不會被包括在內),你不能通過一個過去,因為那只是意味著同樣的事情(感謝Python如何處理負索引),你根本不會切除任何東西。使默認值切換,以便省略結束(或等效地顯式傳遞)一直運行到開頭,包括,是唯一明智的解決方案。step
start
stop
start
stop
mystr[len(mystr)-1:0:-1]
0
-1
0
len(mystr)-1
None
添加回答
舉報