2011-05-01 15 views
26

¿hay algún equivalente a esta notación PHP, que cambia la matriz original (tenga en cuenta el operador de referencia)?

// increase value of all items by 1 
foreach ($array as $k => &$v) { 
    $v++; 
} 

sé que sólo de esta manera, que no es tan elegante:

for i in range(len(array)): 
    array[i] += 1 

Respuesta

5

Usted podría utilizar list comprehension:

newArray = [i + 1 for i in array] 
+2

esto está muy bien si sus listas son pequeñas, pero si usted se ocupa de una gran cantidad de datos, que desea evitar la asignación una segunda lista – blubb

+0

Eso es cierto, para las listas más grandes, tendremos que comprometer el código de fantasía para la eficiencia :) – Sahas

+0

Pero todavía creo que la comprensión de la lista sería más rápida que el uso de enumerar. Pero supongo que eso depende de cómo la comprensión de la lista funcione internamente. – Sahas

46

Cuando el construido en enumerate() función se llama en una lista, devuelve un objeto que puede repetirse, devolviendo un recuento y el valor devuelto de la lista.

for i, val in enumerate(array): 
    array[i] += 1 
+0

Además, el tipo de matriz de PHP funciona como una matriz, lista o dict dependiendo de lo que coloque en ella; así 'para la clave, el valor en dictionary.iteritems():' puede aplicarse. –

1

estoy al tanto de ser capaz de obtener un puntero a un elemento de lista, sino una forma más limpia de acceder por el índice se demuestra por http://effbot.org/zone/python-list.htm:

for index, object in enumerate(L): 
    L[index] = object+1 
2

En cuanto a las referencias.

En python, cada valor es un objeto, y cada 'variable' es una referencia al objeto. La asignación nunca copia el valor, siempre asigna referencia.

Por lo tanto, v en for k,v in enumerate([1,2,3]) es una referencia también, por defecto. Sin embargo, la mayoría de los objetos de 'tipos' básicos son inmutables, por lo tanto, al hacer immutable_object_reference += 1, crea una instancia nueva de int y cambia immutable_object_reference para que apunte a una instancia nueva.

Cuando nuestros valores son de tipos mutables, referencias de trabajo mismo que en PHP:

>>> class mutable_pseudoint(object): 
...  def __init__(self, d): 
...   self.d = d 
...  def __iadd__(self, v): 
...   self.d += v 
...  def __repr__(self): 
...   return self.d.__repr__() 
...  def __str__(self): 
...   return self.d.__str__() 
... 
>>> l = [mutable_pseudoint(1), mutable_pseudoint(2), mutable_pseudoint(3), mutable_pseudoint(4)] 
>>> l 
[1, 2, 3, 4] 
>>> for k,v in enumerate(l): 
...  v += 1 
... 
>>> l 
[2, 3, 4, 5] 
Cuestiones relacionadas