2012-11-24 11 views
8
>>>a=[999999,2,3] 
    >>>b=[999999,2,3] 
    >>>print(a[0] is b[0]) 
    False#because it works for numbers -5 through 256 
    >>>a=[1,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#because it works for numbers -5 through 256 
    >>>a=[999999,2,3] 
    >>>b=a[:] 
    >>>print(a[0] is b[0]) 
    True#why not False ??? 

cosa succede b = a [:] (perché non funziona per i numeri da -5 a 256)?cosa succede b = a [:] in python?

+0

Credo che tu stia confondendo due cose strane: 1) 'b = a [:]' copia il riferimenti a tutti gli interi, quindi 'b [0]' punta allo stesso int di 'a [0]' e 'a [0] è b [0]' restituisce 'Vero'. 2) i riferimenti ai numeri da -5 a 256 vengono mantenuti in ogni momento. – Shep

risposta

11

La -5 a 256 gamma ha a che fare con la following:

L'implementazione corrente mantiene un array di oggetti interi per tutti gli interi tra -5 e 256, quando si crea un int in tale intervallo si in realtà basta recuperare un riferimento all'oggetto esistente.

A dimostrazione di ciò, si noti come id(123) continua a tornare lo stesso valore, mentre id(9999) possono restituire valori diversi:

In [18]: id(123) 
Out[18]: 9421736 

In [19]: id(123) 
Out[19]: 9421736 

In [20]: id(9999) 
Out[20]: 9708228 

In [21]: id(9999) 
Out[21]: 10706060 

Si tratta naturalmente di un artefatto della implementazione corrente. Un'implementazione Python differente potrebbe non farlo, o potrebbe utilizzare un intervallo diverso.

Per quanto riguarda il tuo ultimo esempio:

In [14]: a=[999999, 2, 3] 

In [15]: b=a[:] 

In [16]: map(id, a) 
Out[16]: [10908252, 9421180, 9421168] 

In [17]: map(id, b) 
Out[17]: [10908252, 9421180, 9421168] 

Come si può vedere, [:] copia semplicemente i riferimenti. Questo spiega perché a[i] is b[i] valuta True per tutti i.

+0

E la ragione per cui questo è possibile è che gli interi sono immutabili. – kindall

+0

Per l'esempio 'id (9999)', diventa ancora più confuso: provalo in un normale prompt di Python 2.x invece di IPython, e vedrai lo stesso valore tornare ogni volta (perché lo stesso slot intero è viene riutilizzato ogni volta, l'esistenza della storia in IPython rende tutto ciò impossibile, ovviamente). –

0
a=[1,2,3] 

b=a rende b un alias di a. Ciò significa che tutte le modifiche a b verranno visualizzate in a.

b = a [:] significa eseguire una copia di a e assegnarla a b.

1
>>>b=a[:] 

Esegue una copia superficiale degli elementi nell'elenco a e dei nomi che copiano b. Tutti gli elementi contenuti nel nuovo elenco avranno gli stessi ID oggetto (puntatori del pensiero) come gli elementi nell'elenco originale. Questo è un comportamento previsto.

1

Aggiungendo a @NPE's answer, ecco una bella illustrazione:

a = range(-7, 259) 
b = range(-7, 259) 
for x, y in zip(a,b): 
    print x, x is y 

stampe:

-7 False 
-6 False 
-5 True 
-4 True 
... 
255 True 
256 True 
257 False 
258 False 
Problemi correlati