2016-10-14 7 views
0

tun alles in Microsoft Shell und mit 2.7.12Variable Erstellungsprozess in Python

Prelude

a = [1,2,3,4,5] 
b = [1,2,3,4,5] 
c = a 

Aktionen

a[0] is b[0] is c[0] 
True 

Sind die drei Listen auf die gleichen Elemente in den Zeige Speicherort? und können sich daher ändern, wenn man sich verändert?

Teil I verstehen:

c[0] = 8888888 
a[0] 
8888888 

Teil verstehe ich nicht:

b[0] = 9999999 
a[0] 
1 
+0

Warum sollte ' a' und 'b' zeigen auf den gleichen Ort? nur weil sie zufällig Listen mit identischen Werten haben? – UnholySheep

+0

So passiert es in Python. Sie erstellen also a = 5 und suchen nach itl, wenn 5 bereits existiert, und wenn a darauf verweist. lustige Übung für dich: a = [1,2,3,4,5]; g = 4; g ist ein [3]; Wahr. lustig, richtig??!! kann jemand bestätigen, wenn das, was ich gerade gesagt habe, richtig ist? PS - Neu in der Community –

+0

Ganzzahlen sind unveränderlich, Liste ist veränderbar. Die bereitgestellten Antworten erklären das sehr detailliert. "So passiert es in Python" ist natürlich auch falsch, sonst würden Sie das Ergebnis, das Sie sehen, nicht sehen. – UnholySheep

Antwort

3

Python entscheiden können, unveränderliche Objekte Speicherung zu teilen (Strings, Zahlen, ...)

Da sie unveränderlich sind, ist sie für den Benutzer transparent. Es spart nur Speicher.

a[0] is b[0] 

könnte wahr oder falsch sein. Auf der anderen Seite

a[0] is c[0] 

ist immer wahr, weil a is c. (Und die Änderung von a Änderungen c)

Aber da list Typ wandelbar ist, kann a sein nicht b (Python nicht selbst ermöglicht die Lagerung in diesem Fall zu optimieren). Das sind unabhängige Objekte. Die Änderung a kann nicht geändert werden b.

Hinweis zu meiner Bemerkung "kann wahr oder falsch sein". Betrachten Sie dies in Python 3,4

>>> b=1234567890 
>>> a=[1234567890] 
>>> b is a[0] 
False 

Python nicht die Mühe, die Verbindung zwischen b und a[0] zu machen. Auch passiert mit langen Strings (ich nehme an, dass wäre ein Leistungsproblem vs geringe Wahrscheinlichkeit, eine genaue große Anzahl 2 mal hintereinander zu finden? 1 hat bessere Chance, im gesamten Programm wiederholt werden)

Allerdings, wenn Sie dies tun erhalten Sie ein anderes Ergebnis:

>>> b=1234567890 
>>> a=[b,1,2] 
>>> b is a[0] 
True 

(ich sicher nicht sagen würde, warum, wie sie variieren je nachdem, ob sie als long int oder nur int, Wert oder Adresse gespeichert ist, etc ..., aber Python hat definitiv mehr Informationen über den Wert, der hier dupliziert wird!)

Fazit ist: verlassen Sie sich nicht darauf für immuta ble Objekte. Verwenden Sie immer ==.

+0

Sie sagen: -a = [1,2,3,4] –

+0

Sie sagen a = [1,2,3,4] b = 1 a [0] ist b kann falsch sein –

+0

definitiv, vielleicht nicht für den Wert "1" aber immer noch: siehe meine Bearbeitung. –

0

int s sind unveränderlich. Das heißt, wenn Sie a[0] neu zuweisen, ändern Sie nichts, was 1 ist. Stattdessen ändern Sie, was auch immer a[0] gilt. Sie ändern nicht, was es bedeutet, 1 zu sein - Sie ändern, was es bedeutet, a[0] zu sein.

Wenn auf der anderen Seite haben Sie dies:

L = [1,2,3] 
a = [L] 
b = [L] 
a.[0].append(4) 

Sie die Änderung auch in b reflektiert sehen würde

0

Zuordnung in Python ist durch Referenz - eine neue Referenz erstellt, oder Alias für ein Objekt, nicht kopiert das Objekt - und da Ereignis int ist ein Objekt in Python - zumindest (in meiner Version - bis zu 256), funktioniert diese Regel meist funktioniert.

Das folgende Beispiel wit Funktion id - die Objektreferenz zeigt - illustriert den Punkt

In [37]: a = range(1, 6) 

In [38]: b = range(1, 6) 

In [39]: id(1) 
Out[39]: 4298160472 

In [40]: id(a[0]) 
Out[40]: 4298160472 

In [41]: id(a) 
Out[41]: 4376534696 

In [42]: id(b) 
Out[42]: 4378531744 

In [44]: c = a 

In [45]: id(c) 
Out[45]: 4376534696 

Dies ist jedoch nicht auf Schwimmern arbeiten - die seit Menge von Schwimmern logisch ist, und ganze Zahlen sind unendlich

In [49]: a = .1 

In [50]: b = .1 

In [51]: id(a) 
Out[51]: 4298708040 

In [52]: id(b) 
Out[52]: 4303248152 

Wie Sie sehen können, neues Objekt wird für jeden neuen Schwimmer geschaffen, obwohl Wert ist die gleiche