Dlaczego nie 'example'[999:9999]
powoduje błędu? Skoro 'example'[9]
tak, jaka jest motywacja za tym?
Na podstawie tego zachowania mogę założyć, że 'example'[3]
zasadniczo / wewnętrznie nie jest to to samo co 'example'[3:4]
, mimo że oba skutkują tym samym 'm'
ciągiem.
[999:9999]
nie jest indeksem, to wycinek i ma inną semantykę. Z wprowadzenia do Pythona: „Zdegenerowane indeksy wycinków są obsługiwane z wdziękiem: indeks, który jest zbyt duży, jest zastępowany rozmiarem ciągu, a górna granica mniejsza niż dolna zwraca pusty ciąg”.Odpowiedzi:
Masz rację!
'example'[3:4]
i'example'[3]
są zasadniczo różne, a wycinanie poza granice sekwencji (przynajmniej w przypadku elementów wbudowanych) nie powoduje błędu.Na początku może to być zaskakujące, ale ma sens, gdy się nad tym zastanowić. Indeksowanie zwraca pojedynczy element, ale wycinanie zwraca podciąg elementów. Więc kiedy próbujesz zindeksować nieistniejącą wartość, nie ma nic do zwrócenia. Ale kiedy wycinasz sekwencję poza granicami, nadal możesz zwrócić pustą sekwencję.
Część tego, co jest niejasne, polega na tym, że łańcuchy zachowują się nieco inaczej niż listy. Zobacz, co się dzieje, gdy robisz to samo z listą:
>>> [0, 1, 2, 3, 4, 5][3] 3 >>> [0, 1, 2, 3, 4, 5][3:4] [3]
Tutaj różnica jest oczywista. W przypadku łańcuchów wyniki wyglądają na identyczne, ponieważ w Pythonie nie ma czegoś takiego jak pojedynczy znak poza łańcuchem. Pojedynczy znak to tylko 1-znakowy ciąg.
(Aby poznać dokładną semantykę wycinania poza zakresem sekwencji, zobacz odpowiedź mgilsona ).
źródło
None
zamiast błędu - taka jest zwykła konwencja Pythona, gdy nie masz nic do zwrócenia.None
w tym przypadku utrudniłoby odróżnienie indeksu spoza zakresu odNone
wartości wewnątrz listy. Ale nawet gdyby istniało obejście tego problemu, pozostaje dla mnie jasne, że zwrócenie pustej sekwencji jest właściwą rzeczą do zrobienia, gdy otrzyma się wycinek poza zakresem. Jest to analogiczne do wykonania sumy dwóch rozłącznych zbiorów.None
wartości na liście.W celu dodania odpowiedzi wskazującej na solidną sekcję w dokumentacji :
Biorąc pod uwagę wyrażenie takie jak
s[i:j:k]
:jeśli piszesz
s[999:9999]
, python wracas[len(s):len(s)]
od,len(s) < 999
a twój krok jest dodatni (1
- domyślny).źródło
k
jest pozytywny,i
aj
także wzrasta,-len(s)
gdy są mniejsze? np.s = 'bac'; s[-100:2] == s[-len(s):2]
k
jest dodatnia, Python skaluje sięi
ij
dopasowuje do granic sekwencji. W twoim przykładzies[-100:2] == s[0:2]
(== s[-len(s):2]
przy okazji). Podobnies[-100:100] == s[0:2]
.Krojenie nie jest sprawdzane przez typy wbudowane. I chociaż oba twoje przykłady wydają się mieć ten sam wynik, działają one inaczej; zamiast tego wypróbuj je z listą.
źródło