2012-04-07 8 views

Antwort

9

Python kopiert kein Element von einem in x. Es bezieht sich einfach auf das erste Element von as als x. Das bedeutet: Wenn Sie x ändern, ändern Sie auch das Element von a.

Hier ist ein Beispiel:

>>> a = [ [ 1,2,3 ], [ 4,5,6] ] 
>>> for x in a: 
...  x.append(5) 
... 
>>> a 
[[1, 2, 3, 5], [4, 5, 6, 5]] 
+2

Um explizit zu antworten "tut Python das mit einem Iterator" ist die Antwort ja, aber ein Python Iterator ist nicht ganz wie ein C++ Iterator, und die Tatsache, dass 'x' keine Kopie ist, ist getrennt - if Sie sollten 'x = a [1]' tun, es würde auch keine Kopie machen. – agf

4

Erstens sind solche wandelbar Listen [1, 2, 3], nicht unveränderlich Tupeln (1, 2, 3).

Zweitens ist die Antwort, dass sie nicht kopiert werden, sondern durch Verweis weitergegeben. Wenn Sie also in dem Fall der veränderbaren Listen in Ihrem Beispiel einen Wert von x ändern, wird auch a geändert.

+0

Es ist nicht _exactly_ per Referenz übergeben, obwohl das nahe ist, was Python tut. Und seien Sie vorsichtig und sagen Sie "Ändern Sie den Wert von x", weil "x = 3" nicht "a" ändert. – agf

+0

Danke für die Klarstellung. – mVChr

+0

Danke für die Korrektur. Ich verwechselte Listen mit Tupeln. – smilitude

4

Das for element in aList: tut folgendes: Es erstellt ein Label mit dem Namen element, die auf das erste Element der Liste verweist, dann das zweite ... bis es das letzte erreicht. Das Objekt wird nicht in die Liste kopiert.

Schreiben x.append(5) wird das Element ändern. Wenn x = [4, 5, 6] geschrieben wird, wird das x-Label nur an ein neues Objekt gebunden, so dass es keinen Einfluss auf a hat.