Co znaczy?


96

Analizuję kod w Pythonie i nie wiem co

pop = population[:]

znaczy. Czy jest to coś w rodzaju list tablic w Javie, czy też jak tablica dwuwymiarowa?


1
W związku z tym wyczyszczenie listy jest możliwe tylko poprzez wykonanie del pop [:] lub pop [:] = [], a nie pop.clear () .. (tak jak w przypadku dykt).
Macke

Dobra dyskusja SO na temat Pythona Slice: stackoverflow.com/questions/509211/ ...
Scott C Wilson

@Macke: Uwaga: Począwszy od Pythona 3.3, lists zapewniają cleari copymetody, równoważne wykonaniu del mylist[:]lub mylist[:]odpowiednio. Nie są one ogólnie wymagane w przypadku sekwencji podlegających zmianom, więc jeśli możesz otrzymać dowolną sekwencję podlegającą mutacji, powinieneś trzymać się operacji opartych na wycinkach, ale nazwane metody są przynajmniej dostępne list.
ShadowRanger

Odpowiedzi:


110

Jest to przykład notacji plastra, a jego działanie zależy od typu population. Jeśli populationjest listą, ta linia utworzy płytką kopię listy. Dla obiektu typu tuplelub a strnie zrobi nic (linia zrobi to samo bez [:]), a dla (powiedzmy) tablicy NumPy, utworzy nowy widok na te same dane.


14
Na wszelki wypadek: wycinek zwraca płytką kopię.
André Caron

4
@ilius: Może l.copy()jest bardziej czytelny, ale nie zadziała.
Sven Marnach

13
list(l)zawsze działa, jest bardziej czytelny i gwarantuje, że zwróci kopię nawet z czymś takim jaknumpy.array
Rosz Oksymoron

1
@Eli: Tak, obok list.clear(). Jednak minie trochę czasu, zanim doprowadzi to do znacznej redukcji tego rodzaju pytań dotyczących SO. :)
Sven Marnach

1
@MichaelGraczyk: Zakładam, że mówisz tutaj o tablicach NumPy. Zamiast używać A[deque(chain((k,), repeat(slice(None), len(A.shape) - 1)).rotate(axis)], prawie zawsze wolę numpy.rollaxis(A, axis, 0)[k]. Ogólnie rzadko spotykam przypadek użycia, w którym trzeba bezpośrednio tworzyć slice()obiekty. Jeśli mimo wszystko ich potrzebujesz, NumPy zapewnia s_pomocnika jako alternatywny sposób ich tworzenia.
Sven Marnach,

27

Warto również wiedzieć, że wycinek listy generalnie tworzy kopię części listy. Np. Zwróci population[2:4]listę zawierającą populację [2] i populację [3] (krojenie jest wyłączne dla praw). Pomijając lewy i prawy indeks, ponieważ population[:]domyślnie mają wartość 0 i długość (populacja), wybierając w ten sposób całą listę. Dlatego jest to powszechny idiom, w którym można skopiować listę.


15

cóż ... to naprawdę zależy od kontekstu. Ostatecznie przechodzi sliceobiekt ( slice(None,None,None)) oznacza jedną z następujących metod: __getitem__, __setitem__i __delitem__. (Właściwie, jeśli obiekt ma __getslice__, to zostanie użyte zamiast __getitem__, ale jest teraz przestarzałe i nie powinno być używane).

Obiekty mogą robić z plastrem, co chcą.

W kontekście:

x = obj[:]

Spowoduje to wywołanie obj.__getitem__z przekazanym obiektem plasterka. W rzeczywistości jest to całkowicie równoważne z:

x = obj[slice(None,None,None)]

(chociaż ta pierwsza jest prawdopodobnie bardziej wydajna, ponieważ nie musi szukać slicekonstruktora - wszystko odbywa się w kodzie bajtowym).

W przypadku większości obiektów jest to sposób na utworzenie płytkiej kopii części sekwencji.

Kolejny:

x[:] = obj

Jest sposobem na ustawienie elementów (wywołuje __setitem__) na podstawie obj.

i myślę, że prawdopodobnie możesz się domyślić, co:

del x[:]

dzwoni ;-).

Możesz również przekazać różne plasterki:

x[1:4]

konstrukcje slice(1,4,None)

x[::-1]

konstrukcje slice(None,None,-1)i tak dalej. Dalsza lektura: Wyjaśnij notację wycinków w Pythonie



6

Tworzy kopię listy, zamiast przypisywać nową nazwę do już istniejącej listy.


5

[:]
używane do ogranicznika lub dzielenia w tablicy, hash
np:
[1: 5] do wyświetlania wartości od 1 włącznie do 5 wyłącznych tj. 1-4
[start: end]

zasadniczo używane w tablicy do krojenia, rozumiemy nawias akceptuje zmienną, która oznacza wartość lub klawisz do wyświetlenia, a „:” służy do ograniczania lub dzielenia całej tablicy na pakiety.


1
Nie ma powodu, aby uderzać w tak stare pytanie, które ma już 5 podobnych odpowiedzi, a nawet jedną zaakceptowaną ... Poza tym a[1:5]zwraca elementy 1-4, a nie 2-4.
Skamah One

@SkamahOne Och, nie wiem. Może nie w tym przypadku, ale czasami warto zadać martwe pytania. Inny wgląd, inne sformułowania itp. W tym przypadku poprawiłeś odpowiedź i miejmy nadzieję, że oni też się czegoś nauczyli.
Pryftan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.