Dokument Pythona mówi, że cięcie listy zwraca nową listę.
Teraz, jeśli zwracana jest „nowa” lista, mam następujące pytania związane z „Przydziałem do plasterków”
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Teraz wynik będzie następujący:
[4, 5, 3]
- Jak coś, co coś zwraca, może pojawić się po lewej stronie ekspresji?
- Tak, przeczytałem dokumentację i jest tam napisane, że jest to możliwe, skoro cięcie listy zwraca „nową” listę, dlaczego oryginalna lista jest modyfikowana? Nie jestem w stanie zrozumieć stojącej za tym mechaniki.
a[0] = 4
by zrobił?=
, więc zamiast odrzucać to jako nieprawidłową składnię, Python zamienia go w coś bardziej podobnego do tego, czego można się spodziewać. Ponieważ Python nie ma odniesień, nie działałoby, gdyby wycinek zmienił oryginalną listę. Otrzymasz kopię. Jeśli podałeś więcej informacji na temat swojej aplikacji, być może będziemy mogli lepiej pomóc Ci robić rzeczy w sposób „pythonowy”. :)Odpowiedzi:
Mylisz dwie różne operacje, które używają bardzo podobnej składni:
1) krojenie:
To tworzy kopię wycinka
a
i przypisuje go dob
.2) przypisanie plasterków:
To zastępuje się kawałek
a
z treściąb
.Chociaż składnia jest podobna (tak sobie wyobrażam!), Są to dwie różne operacje.
źródło
start=1
,stop=None
. Pozwoli to uniknąć jakichkolwiek kopii i wykorzysta leniwą ocenę (w twoim przypadku leniwy dostęp do oryginalnej listy).Kiedy określasz
a
po lewej stronie=
operatora, używasz normalnego przypisania Pythona , które zmienia nazwęa
w bieżącym kontekście, aby wskazywała na nową wartość. Nie zmienia to poprzedniej wartości, na którąa
wskazywano.Określając
a[0:2]
po lewej stronie=
operatora, mówisz Pythonowi, że chcesz użyć Slice Assignment . Przypisanie plasterka to specjalna składnia dla list, w której można wstawiać, usuwać lub zamieniać zawartość listy:Wstawianie :
Usunięcie :
Zamiennik :
Uwaga:
Slice Assignment zapewnia podobną funkcję do Tuple Unpacking . Na przykład
a[0:1] = [4, 5]
jest równoważne z:Za pomocą funkcji Rozpakowywanie krotek można modyfikować listy niesekwencyjne:
Jednak rozpakowanie krotki ogranicza się do wymiany, ponieważ nie można wstawiać ani usuwać elementów.
Przed i po tych wszystkich operacjach
a
jest ta sama dokładna lista. Python po prostu zapewnia ładny cukier składniowy do modyfikowania listy w miejscu.źródło
a[:] = some_list
odpowiednikiema = some_list[:]
luba = some_list
?a[:] = some_list
ustawia każdy elementa
będzie tychsome_list
. Wykonanie któregokolwiek z wymienionych, zmieniłoby to, coa
jest. Na przykład:a = [1, 2, 3]
b = a
a[:] = [4, 5, 6]
a is b
. Ostatnia linia byłaby False, gdyby zmieniłaa
wartość, zamiast ją modyfikować.Natknąłem się wcześniej na to samo pytanie i jest ono związane ze specyfikacją języka. Zgodnie z instrukcjami przypisania ,
Jeśli lewa strona przypisania to subskrypcja, Python wywoła
__setitem__
ten obiekt.a[i] = x
jest równoważnea.__setitem__(i, x)
.Jeśli lewa strona przypisania to slice, Python również wywoła
__setitem__
, ale z innymi argumentami:a[1:4]=[1,2,3]
jest równoważnea.__setitem__(slice(1,4,None), [1,2,3])
Dlatego wycinek listy po lewej stronie '=' zachowuje się inaczej.
źródło
Przecinając po lewej stronie operacji przypisywania, określasz, do których elementów chcesz przypisać.
źródło