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?
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?
list
s zapewniają clear
i copy
metody, 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
.
Odpowiedzi:
Jest to przykład notacji plastra, a jego działanie zależy od typu population
. Jeśli population
jest listą, ta linia utworzy płytką kopię listy. Dla obiektu typu tuple
lub a str
nie zrobi nic (linia zrobi to samo bez [:]
), a dla (powiedzmy) tablicy NumPy, utworzy nowy widok na te same dane.
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 zapewnia s_
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ę.
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:
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ć 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:
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
Tworzy kopię listy, zamiast przypisywać nową nazwę do już istniejącej listy.
[:]
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.
a[1:5]
zwraca elementy 1-4, a nie 2-4.