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]
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
Eso es cierto, para las listas más grandes, tendremos que comprometer el código de fantasía para la eficiencia :) – Sahas
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