2015-11-03 8 views
5

sto lottando con questo strano comportamento in Python (2 e 3):Strano linea assegnazione

>>> a = [1, 2] 
>>> a[a.index(1)], a[a.index(2)] = 2, 1 

Questo si traduce in:

>>> a 
[1, 2] 

Ma se si scrive

>>> a = [1, 2] 
>>> a[a.index(1)], a[a.index(2)] = x, y 

dove x, y != 2, 1 (può essere 1, 1, 2, 2, 3, 5, ecc.), Ciò risulta in:

>>> a == [x, y] 
True 

Come ci si aspetterebbe. Perché lonon produce il risultato a == [2, 1]?

>>> a == [2, 1] 
False 
+1

Hai fatto una strana domanda. Perché dovrei 'a [a.index (1)], a [a.index (2)] = 2, 1' stampare qualcosa? :) – Alik

+0

Intendo quando si richiede il valore di a. Sto abusando della notazione. XD – Dargor

+0

Correlati (e subdoli): http://stackoverflow.com/q/32127908/3001761 – jonrsharpe

risposta

10

perché in realtà verrà interpretato in questo modo:

>>> a = [1, 2] 
>>> a 
[1, 2] 
>>> a[a.index(1)] = 2 
>>> a 
[2, 2] 
>>> a[a.index(2)] = 1 
>>> a 
[1, 2] 

Per citare, per il standard rules for assignment (sottolineatura mia):

  • Se la lista di destinazione è un separato da virgole elenco degli obiettivi: l'oggetto deve essere iterabile con lo stesso numero di elementi quanti sono gli obiettivi nell'elenco di destinazione e gli elementi sono assegnati, da sinistra a destra, a gli obiettivi corrispondenti.

L'assegnazione di a[a.index(1)] (cioè a[0]) avviene prima la seconda assegnazione chiede a.index(2), quando ormai a.index(2) == 0.

Si vedrà lo stesso comportamento per ogni incarico:

foo = [a, b] 
foo[foo.index(a)], foo[foo.index(b)] = x, y 

dove x == b (in questo caso, ogni incarico in cui il primo valore sul lato destro è 2).

+1

Puoi fare riferimento all'ordine di assegnazione in Python dai documenti? – Dargor

+0

Grazie in anticipo! – Dargor

+0

Upvoted e accettato. Grazie per il tuo ottimo lavoro! – Dargor