2012-03-28 12 views
11

io sono un nuovo arrivato a Python ma capisco che le cose non dovrebbero essere fatte in questo modo, quindi si prega di prendere in considerazione i seguenti frammenti di codice come puramente :-) educativoList modifica in un ciclo

Sono attualmente la lettura di 'Learning Python' e cercando di comprendere appieno il seguente esempio:

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

non capivo se questo comportamento è stato in qualche modo legati alla immutabilità dei tipi numerici, quindi ho eseguito il seguente test:

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

Domanda: cosa rende l'elenco invariato nel primo codice e modificato nel secondo?

La mia intuizione è che la sintassi è fuorviante e che:

  • x += 1 per un intero significa veramente x = x + 1 (assegnando in tal modo un nuovo riferimento)
  • x += ['_'] per una lista davvero significa x.extend('_') (modificando così il elenco sul posto)
+7

l'intuizione è corretta –

+3

e per completezza, il modo "corretto" per farlo è '[x + 1 per x in L]' – Kimvais

+0

@Kimvais: presuppone che si desideri creare un nuovo elenco. – MattH

risposta

5

Domanda: cosa rende l'elenco invariato nel primo codice e modificato nel secondo?

Nel primo codice, la lista è una sequenza di numeri interi (immutabili). Il loop imposta x per riferirsi a ciascun elemento della sequenza a turno. x += 1 modifica x per fare riferimento a un numero intero diverso da uno in più rispetto al valore x precedentemente indicato. L'elemento nell'elenco originale è invariato.

Nel secondo codice, nell'elenco se una sequenza di elenchi (modificabili). Il loop imposta x per riferirsi a ciascun elemento della sequenza a turno. x += ['_'] come x fa riferimento a un elenco, questo estende l'elenco a cui fa riferimento x con ['_'].

+0

Quindi è proprio l'immutabilità dell'intero che lo spiega, grazie! – icecrime