2012-03-30 11 views
6

Quindi questo è quello che ho cercato di fare.Copia lista in python: deep vs shallow copy: gotcha for me in python?

vectorized = [0] * length 
for i,key in enumerate(foo_dict.keys()): 
    vector = vectorized 
    vector[i] = 1 
    print vector 
    vector = vectorized 
print vectorized 

Quindi quello che speravo era per esempio la lunghezza è di 4. Quindi creo un vettore 4 dimensione:

vectorized=[0,0,0,0] 

ora, a seconda dell'indice di dizionario (che è anche di lunghezza 4 in questo caso) creare un vettore con il valore 1, mentre resto ha zero

so vector = [1, 0,0,0] , [0,1,0,0] and so on.. 

Ora, invece quello che sta accadendo è:

0.123.516,41 mila
vector = [1,0,0,0],[1,1,0,0] .. and finally [1,1,1,1] 

anche vettorializzare è ora

[1,1,1,1] 

Cosa c'è di sbagliato che sto facendo. e come ottengo ciò che voglio raggiungere. Fondamentalmente sto cercando di creare vettori unitari. Grazie

+0

Vorrei più domande erano questa qualità. +1. Consiglierei solo di migliorare il titolo. – Trufa

+1

@Trufa: modificato :) – Fraz

risposta

9

Questa linea (queste righe, in realtà):

vector = vectorized 

copia del riferimento lista. Devi fare una copia superficiale dei contenuti della sequenza.

vector = vectorized[:] 
5

Si sta creando un elenco singolo e quindi dandogli diversi nomi diversi. Ricorda che a = b non crea un nuovo oggetto. Significa solo che aeb sono entrambi i nomi per la stessa cosa.

Prova a modificare:

for ...: 
    vector = [0] * length 
    ... 
4

La linea

vector = vectorized 

non sta facendo una copia di vectorized. Ogni volta che cambierai vector da quel momento in poi, cambierai anche `vettorizzato.

È possibile cambiare la prima linea a:

vector = vectorized[:] 

o

import copy 
vector = copy.copy(vectorized) 

Se si vuole fare una copia.

2

Mentre in Python, quando assegni un elenco a un nuovo elenco, il nuovo elenco è solo un puntatore piuttosto che uno nuovo.

Così quando si tenta di modificare il valore di "vettore", si sta effettivamente cambiando il valore di "vettorizzato". E nel tuo caso, vector[i] = 1 è stessa vectorized[i] = 1

1

Il tuo problema è che quando si scrive vector = vectorized non sta creando una copia della matrice, anzi è la creazione di un legame tra i due.

Le istruzioni di assegnazione in Python non copiano oggetti, creano collegamenti tra una destinazione e un oggetto.

http://docs.python.org/library/copy.html

Questo dovrebbe aiutare a ottenere che risolto.

Ed ecco un piccolo frammento dal REPL di Python per mostrarvi cosa intendo.

>>> vectorized = [0] * 4 
>>> print vectorized 
[0, 0, 0, 0] 
>>> vector = vectorized 
>>> vector[1] = 1 
>>> print vectorized 
[0, 1, 0, 0] 

MODIFICA: Cavolo ragazzi siete veloci!