2012-06-09 8 views
6
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win 
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> u = [4, 5, 6, 7, 8, 9] 
>>> u[1::1] = [3, 2, 1, 0] 
>>> u 
[4, 3, 2, 1, 0] 
>>> u[9:0:-1] = [8, 7, 6, 5] 
>>> u 
[4, 5, 6, 7, 8] 
>>> u[9:0:-1] = [16, 12, 8] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: attempt to assign sequence of size 3 to extended slice of size 4 
>>> u 
[4, 5, 6, 7, 8] 
>>> 

Oczekiwane zachowanie: żaden wyjątek rzucony na końcowym rachunku przydziału; u powinien wydrukować na ostatniej linii jako [4, 8, 12, 16].Dlaczego nie można przypisać dowolnej iteracji do rozszerzonego plasterka, którego krok to -1?

Mogę przypisać do rozszerzonego plasterka, którego krok wynosi 1, nawet jeśli przypisywana przeze mnie iteracja to "niewłaściwa długość". Dlaczego więc nie mogę przypisać do rozszerzonego plasterka, którego krok wynosi -1 i czy działa on w sposób oczywisty?

Odpowiedz

3

Myślę, że tworząc rozszerzoną kawałek, którego etapem jest 1 skutecznie działa jak zwykły plaster zamiast rozszerzonego wycinka.

Rozszerzone plastry nie pozwalają na zmianę długości sekwencji, jak zauważono here

Jeśli masz zmienny sekwencji takich jak listy lub tablicy można przypisać lub usunąć przedłużony plaster, ale są pewne różnice między przypisaniem do rozszerzonych i zwykłych wycinków. Przypisanie do zwykłego plasterka może być użyte do zmiany długości sekwencji. Rozszerzone plastry nie są tak elastyczne. Przypisując do rozszerzonego plasterka, lista po prawej stronie instrukcji musi zawierać taką samą liczbę elementów jak zastępowany plasterek.

Co do tego, dlaczego to działa w ten sposób, mogę tylko zgadywać, że dzieje się tak z powodu przypadków, w których nie ma oczywistych zachowań. Weź ten przykład:

u = [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 
u[0:8:3] = [ 10, 11 ] 

Jak można się tego spodziewać? Sądzę, że można po prostu wymienić 1 & 4 z 10 & 11, ale co z 7? Czy odszedłeś? Usuń to? Usunąć całą resztę sekwencji za 7? Może to tylko ja, ale ta sprawa nie wydaje się zbyt jasna. Które zakładam, dlaczego tego rodzaju zachowanie nie było dozwolone dla rozszerzonych plasterków.

+2

Ma sens. Mimo to, OP ma rację, że dla kroku -1 oczekiwane zachowanie jest całkiem jasne, więc może być miło mieć ten specjalny przypadek tak, jak krok 1 to ... – weronika

+0

@weronika Zgoda, ale powiedz to do programistów Pythona;) – obmarg

Powiązane problemy