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] 
  1. Jak coś, co coś zwraca, może pojawić się po lewej stronie ekspresji?
  2. 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.
Author: tripleee, 2012-05-16

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.

 123
Author: NPE,
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.

 71
Author: Casey Kuball,
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 ,

  1. Jeśli po lewej stronie przypisania jest subskrypcja, Python wywoła __setitem__ na tym obiekcie. {[1] } jest równoważne a.__setitem__(i, x).

  2. 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żne a.__setitem__(slice(1,4,None), [1,2,3])

Dlatego lista slice na lewa strona ' = ' zachowuje się inaczej.

 28
Author: Stan,
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ć.

 4
Author: fraxel,
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