2012-10-15 6 views

risposta

61

Non utilizzare accodamento, ma la concatenazione invece:

yourList = myList + [40] 

Questo restituisce una nuova lista ; myList non sarà interessato. Se è necessario avere myList interessato o utilizzare .append() in ogni caso, quindi assegnare yourList separatamente da (una copia di) myList.

+0

quale sarebbe stata la logica alla base di 'append()' restituendo 'None' invece della stessa lista? Quale principio zen violerebbe? –

+1

@CiprianTomoiaga: vedere https://en.wikipedia.org/wiki/Command%E2%80%93query_separation; 'list.append' è un comando, non una query. –

+0

@CiprianTomoiaga: vedi anche [questa email dal Python BDFL] (https://mail.python.org/pipermail/python-dev/2003-October/038855.html). –

5

list.append è un built-in e, pertanto, non può essere modificato. Ma se siete disposti a usare qualcosa di diverso append, si potrebbe provare +:

In [106]: myList = [10,20,30] 

In [107]: yourList = myList + [40] 

In [108]: print myList 
[10, 20, 30] 

In [109]: print yourList 
[10, 20, 30, 40] 

Naturalmente, l'aspetto negativo di questo è che un nuovo elenco è stato creato, che prende molto più tempo di quanto append

Spero che questo aiuti

+0

Ma il built-in può essere sottoclasse e quindi tutto va :) –

+0

@MarcinWyszynski: sì, ma possono essere modificati solo all'interno della sottoclasse. Il metodo built-in di un oggetto/classe built-in può essere raramente sovrascritto, se mai – inspectorG4dget

+2

Per la tua sanità mentale e quella dei tuoi colleghi non dovresti mai farlo :) –

0

Hai solo bisogno di fare myList.append (40)

si aggiungerà alla lista originale, non restituire un nuovo elenco.

1

È possibile creare una sottoclasse del tipo di elenco incorporato e ridefinire il metodo "aggiungi". O ancora meglio, creane uno nuovo che farà ciò che vuoi che faccia. Di seguito è riportato il codice per un metodo 'append' ridefinito.

#!/usr/bin/env python 

class MyList(list): 

    def append(self, element): 
    return MyList(self + [element]) 


def main(): 
    l = MyList() 
    l1 = l.append(1) 
    l2 = l1.append(2) 
    l3 = l2.append(3) 
    print "Original list: %s, type %s" % (l, l.__class__.__name__) 
    print "List 1: %s, type %s" % (l1, l1.__class__.__name__) 
    print "List 2: %s, type %s" % (l2, l2.__class__.__name__) 
    print "List 3: %s, type %s" % (l3, l3.__class__.__name__) 


if __name__ == '__main__': 
    main() 

Spero che questo aiuti.

0

Provare a utilizzare itertools.chain(myList, [40]). Ciò restituirà un generatore come sequenza, piuttosto che allocare una nuova lista. In sostanza, ciò restituisce tutti gli elementi dal primo iterabile finché non viene esaurito, quindi passa al successivo iterabile, fino a quando tutti i iterabili non sono esauriti.

0

Giusto per espandere sulla risposta Storstamp

Hai solo bisogno di fare myList.append (40)

Si aggiungerà alla lista originale, ora è possibile restituire la variabile che contiene l'elenco originale.

Se stai lavorando con elenchi molto grandi questa è la strada da percorrere.

2

in Python 3 è possibile creare nuova lista disimballaggio vecchio e aggiungendo nuovo elemento:

a = [1,2,3] 
b = [*a,4] // b = [1,2,3,4] 

quando si fare:

myList + [40] 

In realtà hanno 3 liste.