2012-03-28 20 views
11

jestem nowicjuszem w Pythonie, ale rozumiem, że rzeczy nie powinny być wykonywane w ten sposób, więc należy wziąć pod uwagę następujące fragmenty kodu jako czysto :-) edukacyjnegomodyfikacja listy w pętli

jestem obecnie czytanie „Learning Python” i stara się w pełni zrozumieć następujący przykład:

>>> L = [1, 2, 3, 4, 5] 
>>> for x in L: 
... x += 1 
... 
>>> L 
[1, 2, 3, 4, 5] 

nie zrozumieć, jeśli to zachowanie było nieco związane z niezmienności typów numerycznych, więc Zabrakło mi następujący test:

>>> L = [[1], [2], [3], [4], [5]] 
>>> for x in L: 
... x += ['_'] 
... 
>>> L 
[[1, '_'], [2, '_'], [3, '_'], [4, '_'], [5, '_']] 

Pytanie: co sprawia, że ​​lista pozostaje niezmieniona w pierwszym kodzie i zmieniona w drugiej?

Moja intuicja jest to, że składnia jest mylące i że:

  • x += 1 liczbę całkowitą naprawdę oznacza x = x + 1 (a więc przypisywania nowego odniesienia)
  • x += ['_'] dla listy naprawdę oznacza x.extend('_') (zmieniając w ten sposób lista na miejscu)
+7

Twoja intuicja jest poprawna –

+3

, a dla kompletności "prawidłowym" sposobem na to jest '[x + 1 dla xw L]' – Kimvais

+0

@Kimvais: Zakładamy, że chcesz utworzyć nową listę. – MattH

Odpowiedz

5

Pytanie: co sprawia, że ​​lista pozostaje niezmieniona w pierwszym kodzie i zmieniona w drugiej?

W pierwszym kodzie lista jest sekwencją (niezmiennych) liczb całkowitych. Pętla ustawia x, aby kolejno odnosić się do każdego elementu sekwencji. x += 1 zmienia się x, aby odnieść się do innej liczby całkowitej, która jest o jeden większa od wartości poprzednio przywoływanej przez wartość x. Element na oryginalnej liście pozostaje niezmieniony.

W drugim kodzie, lista jeśli sekwencja (zmienna) list. Pętla ustawia x, aby kolejno odnosić się do każdego elementu sekwencji. x += ['_'] jako x odnosi się do listy, co rozszerza listę, o której mówi x z ['_'].

+0

Tak naprawdę to niezmienność liczby całkowitej wyjaśnia to, dzięki! – icecrime

Powiązane problemy