Jak działa przypisanie z Python list slice?
Python doc mówi, że wycinanie listy zwraca nową listę.
Teraz, jeśli zostanie zwrócona" nowa "lista, mam następujące pytania związane z"przypisaniem do plasterków"
a = [1, 2, 3]
a[0:2] = [4, 5]
print a
Teraz wyjście będzie:
[4, 5, 3]
- Jak coś, co coś zwraca, może pojawić się po lewej stronie ekspresji?
- Tak, Czytam dokumenty i pisze, że jest to możliwe, teraz, skoro wycinanie listy zwraca" nową " listę, dlaczego oryginalna lista jest modyfikowana? Nie jestem w stanie zrozum mechanikę, która za tym stoi.
4 answers
Mylisz dwie różne operacje, które używają bardzo podobnej składni:
1) krojenie:
b = a[0:2]
Tworzy kopię fragmentu a
i przypisuje go b
.
2) Slice assignment:
a[0:2] = b
To zastępuje fragment a
zawartością b
.
Chociaż składnia jest podobna (wyobrażam sobie z założenia!), są to dwie różne operacje.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-16 17:09:24
Kiedy podasz a
po lewej stronie operatora =
, używasz zwykłego przypisania Pythona , które zmienia nazwę a
w bieżącym kontekście, aby wskazać nową wartość. Nie zmienia to poprzedniej wartości, do której wskazywano a
.
Podając a[0:2]
po lewej stronie operatora =
, mówisz Pythonowi, że chcesz użyć przypisania Slice. Slice Assignment to specjalna składnia list, w której można wstawiać, usuwać lub zastąp zawartość z listy:
Wstawianie :
>>> a = [1, 2, 3]
>>> a[0:0] = [-3, -2, -1, 0]
>>> a
[-3, -2, -1, 0, 1, 2, 3]
Usunięcie :
>>> a
[-3, -2, -1, 0, 1, 2, 3]
>>> a[2:4] = []
>>> a
[-3, -2, 1, 2, 3]
Zamiennik :
>>> a
[-3, -2, 1, 2, 3]
>>> a[:] = [1, 2, 3]
>>> a
[1, 2, 3]
Uwaga:
Długość kawałka może się różnić od długości przypisanej sekwencji, zmieniając w ten sposób długość docelowej sekwencji, jeśli Sekwencja celu na to pozwala. - źródło
Slice Assignment zapewnia podobną funkcję do Tuple Unpacking . Na przykład, a[0:1] = [4, 5]
jest równoważne:
# Tuple Unpacking
a[0], a[1] = [4, 5]
Przy rozpakowywaniu krotki można modyfikować listy nie sekwencyjne:
>>> a
[4, 5, 3]
>>> a[-1], a[0] = [7, 3]
>>> a
[3, 5, 7]
Jednak rozpakowywanie krotki ogranicza się do wymiany, ponieważ nie można wstawiać ani usuwać elementów.
Przed i po tych wszystkich operacjach, a
jest dokładnie taka sama lista. Python po prostu zapewnia ładny cukier składniowy, aby zmodyfikować listę na miejscu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-29 15:56:32
Natknąłem się wcześniej na to samo pytanie i jest ono związane ze specyfikacją języka. Zgodnie z assignment-statements ,
Jeśli po lewej stronie przypisania jest subskrypcja, Python wywoła
__setitem__
na tym obiekcie. {[1] } 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 lista slice na lewa strona ' = ' zachowuje się inaczej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-07 10:10:11
Przecinając po lewej stronie operacji przypisania, określasz, do których elementów należy przypisać.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-16 17:08:30