2016-04-28 36 views
7

podczas krojenia w pytona, z pominięciem części end plasterka (czyli koniec w list[:end:]) powoduje end jest określona jako „rozmiar łańcucha, przy czym plastry”. *Dlaczego lista [:: - 1] nie równa się [: len (lista): - 1]?

to jednak nie wydaje się prawdziwe w przypadku korzystania z step argument (STEP w list[::step]) w plasterka, przynajmniej gdy step argument jest -1. Prosty przykład:

>>> l = [1, 2, 3] 
>>> l[::-1] 
[3, 2, 1] 
>>> l[:len(l):-1] 
[] 

Oznacza to, że w przypadku step argumentu podjęcia, pominiętym wartość end jest nie równoważne wyraźnie przepuszczanie rozmiar obiektu, przy czym plastry.

Być może jest to po prostu błąd mojej lektury dokumentacji, ale chciałbym zrozumieć, dlaczego powyższy przykład wydaje się przeczyć dokumentacji Pythona o pominięciu wartości w plasterkach, a najlepiej tam, gdzie jest to udokumentowane.


* Slice indices have useful defaults; an omitted first index defaults to zero, an omitted second index defaults to the size of the string being sliced.

+3

'l [len (l) :: - 1]' to '[3, 2, 1]'. Początek jest końcem, kiedy cofasz się. –

+0

zatrzymanie jest teraz ustawione na trzeci indeks, gdy łańcuch jest odwrócony o krok -1, natychmiast osiąga się zatrzymanie. Dlatego zwraca pustą listę –

+2

Fragment dokumentacji jest niepoprawny. Ma zastosowanie tylko wtedy, gdy krok jest dodatni. W rzeczywistości nie ma żadnej wartości całkowitej, która odpowiada wartości domyślnej dla indeksu stop, gdy krok wynosi -1, ponieważ logicznie będzie wynosił -1, z wyjątkiem tego, że ma specjalne znaczenie dla Pythona. Musisz użyć 'None', aby uzyskać pożądany indeks. To błąd w notacji plastra. –

Odpowiedz

6

Dokumentacja, do której się odwołuje, to samouczek, który zapewnia jedynie nieformalny przegląd składni i semantyki Pythona. Nie wyjaśnia wszystkich szczegółów. Zauważysz, że strona z tutorialem, z którą się łączyłeś, nawet nie omawia ujemnych indeksów.

Rzeczywista dokumentacja znajduje się w bibliografii pod numerem sequence types. Choć jest nieco lakoniczne i nie jest łatwe do zrozumienia na pierwszy przeczytałem, to jednak wyjaśnić, że za kawałek [i:j:k]:

Jeśli i lub j są pomijane lub None, stają się „kończy” wartości (które kończą zależy na znaku k).

+0

idealny, dokładnie tego właśnie szukałem. Nie mogłem znaleźć dokumentacji wyraźnie wyjaśniającej, że 'i' i' j' są odwracane w zależności od znaku 'k'. Przypuszczam, że wprowadzenie wstępnego samouczka dla dokładnego języka jest nierozsądne, chociaż niestety samouczek jest jedyną oficjalną dokumentacją, która pojawia się, gdy google "python krojenie" –

+0

Mówi, że stają się "wartościami końcowymi" w zależności od znaku k. Ale jakie są te wartości końcowe? Jakie są wartości końcowe, gdy k jest dodatnie i jakie one są, gdy są ujemne? –

+0

@AsadMoosvi: Zostało to wyjaśnione w tej samej dokumentacji: "Jeśli i lub j jest większe niż len (s), użyj len (s) .Jeśli pominiesz lub None, użyj 0. Jeśli j jest pominięte lub None, użyj len (s)."Po prostu mapowanie i/j na None/len (s) może się zmienić, jeśli krok jest ujemny. – BrenBarn

2

l[::-1] to samo, co l.__getitem__(slice(None, None, -1)). Ponieważ początek i koniec są zarówno None, lista będzie przechodzić od jednego końca do drugiego. Argument step określa kierunek, a także krok.

Powiązane problemy