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: 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.
@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ę.
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:
[:]
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.
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.
list
s zapewniająclear
icopy
metody, równoważne wykonaniudel mylist[:]
lubmylist[:]
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ępnelist
.Odpowiedzi:
Jest to przykład notacji plastra, a jego działanie zależy od typu
population
. Jeślipopulation
jest listą, ta linia utworzy płytką kopię listy. Dla obiektu typutuple
lub astr
nie zrobi nic (linia zrobi to samo bez[:]
), a dla (powiedzmy) tablicy NumPy, utworzy nowy widok na te same dane.źródło
l.copy()
jest bardziej czytelny, ale nie zadziała.list(l)
zawsze działa, jest bardziej czytelny i gwarantuje, że zwróci kopię nawet z czymś takim jaknumpy.array
list.clear()
. Jednak minie trochę czasu, zanim doprowadzi to do znacznej redukcji tego rodzaju pytań dotyczących SO. :)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 zapewnias_
pomocnika jako alternatywny sposób ich tworzenia.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ę.źródło
cóż ... to naprawdę zależy od kontekstu. Ostatecznie przechodzi
slice
obiekt (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:
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ć
slice
konstruktora - 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:
Jest sposobem na ustawienie elementów (wywołuje
__setitem__
) na podstawieobj
.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źródło
Jest to wycinek od początku do końca sekwencji, zwykle tworzący płytką kopię.
(Cóż, to coś więcej , ale jeszcze nie musisz się tym przejmować).
źródło
Tworzy kopię listy, zamiast przypisywać nową nazwę do już istniejącej listy.
źródło
[:]
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.
źródło
a[1:5]
zwraca elementy 1-4, a nie 2-4.