2010-12-16 8 views
2

Ich bin sicher, dass dies etwas ist einfach, dass ich übersehen habe, aber ich bin die Hoffnung, jemand folgend mir erklären kann:Verstehen nicht, Python Pop Ändern mehrere Variablen

origList = [1, 2, 3, 4, 5, 6, 7, 8] 
def test(inputList): 
    while range(len(inputList)): 
     inputList.pop() 
altList = origList 
test(altList) 
print 'origList:', origList # prints origList: [] 
print 'altList:', altList # prints origList: [] 

Ich dachte, ich verstand list.pop(), aber was ich nicht verstehe, ist, warum die ursprüngliche Liste geändert wird, wenn ich nur die Elemente der alternativen Liste "öffne" ...

+1

'während Bereich (len (Inputlist)):' ist horrend langsamer als 'während len (Inputlist):' die horrend langsamer als 'während Inputlist ist:' –

+0

wie ignacio sagte: @garen, Vergessen Sie nicht, die Antwort zu wählen, die Sie für am besten geeignet halten – Ramy

Antwort

7

Alles in Python ist eine Referenz. Sie sind die gleiche Liste.

altList = origList[:] 
+0

Vielen Dank - genau das, was ich brauchte. – garen

+0

+1 für die Lösung der implizierten Frage. – Ramy

+2

@garen: Vergessen Sie nicht, die Antwort auszuwählen, die Sie für am besten geeignet halten. –

2

dies liegt daran, wenn Sie

altList = origList 

sagen Sie eigentlich die Lage von altList auf den Standort der origList zeigt (da alles in Python ist ein Objekt). effektiv bedeutet Gleichheit hier "mache dasselbe Objekt" anstatt ihnen die gleichen Werte zu geben.

3

Es ist, weil die Zeile:

altList = origList 

nicht eine Kopie des origList Objekts erstellen. Beide Namen beziehen sich auf dasselbe zugrunde liegende Objekt. Informationen zum Erstellen einer Kopie finden Sie unter copy module.

1

Das "Problem" ist diese Zeile:

altList = origList 

In Python, Zuordnung einer Liste wie diese nur eine "flache Kopie" durchführt; altList wird nur eine weitere Referenz auf die Daten in origList, anstatt eine komplett neue Kopie zu sein.

zu bekommen, was Sie wollen, versuchen Sie

from copy import deepcopy 

altList = deepcopy(origList) 
+2

'altList = origList' ist keine flache Kopie, da es sich überhaupt nicht um eine Kopie handelt. 'altList = origList [:]' wäre eine flache Kopie. – kindall