insertar - crear nueva columna python
Python asigna valores a los elementos de la lista en bucle (4)
En primer lugar, no puede reasignar una variable de bucle; bueno, puede hacerlo, pero eso no cambiará la lista sobre la que está iterando. Entonces, establecer foo = 0
no cambiará la lista, sino solo la variable local foo
(que contiene el valor de la iteración al comienzo de cada iteración).
Lo siguiente es que los números pequeños, como 0
y 1
se guardan internamente en un grupo de pequeños objetos enteros (¡Este es un detalle de implementación de CPython, no tiene que ser el caso!) Por eso la ID es la misma para foo
después de asignar 0
a ella. La identificación es básicamente la identificación de ese objeto entero 0
en el grupo.
Si desea cambiar su lista mientras la itera, desafortunadamente tendrá que acceder a los elementos por índice. Por lo tanto, si desea mantener el resultado igual, pero tiene [0, 0, 0]
al final, deberá iterar sobre los índices:
for i in range(len(bar)):
print id(bar[i])
bar[i] = 0
print id(bar[i])
print bar
De lo contrario, no es realmente posible, porque tan pronto como almacene el elemento de una lista en una variable, tiene una referencia separada que está desvinculada de la almacenada en la lista. Y como la mayoría de esos objetos son inmutables y usted crea un nuevo objeto al asignar un nuevo valor a una variable, no obtendrá la referencia de la lista para actualizar.
¿Es esto un comportamiento de pitón válido? Creo que el resultado final debería ser [0,0,0] y la función id () debería devolver valores idénticos en cada iteración. ¿Cómo hacerlo pythonic, y no usar enumerate o range (len (bar))?
bar = [1,2,3]
print bar
for foo in bar:
print id (foo)
foo=0
print id(foo)
print bar
salida:
[1, 2, 3]
5169664
5169676
5169652
5169676
5169640
5169676
[1, 2, 3]
Sí, la salida que obtuviste es el comportamiento ordinario de Python. Asignar un nuevo valor a foo
cambiará la identificación de foo, y no cambiará los valores almacenados en la bar
.
Si solo quieres una lista de ceros, puedes hacer:
bar = [0] * len(bar)
Si desea hacer una lógica más complicada, donde la nueva asignación depende del valor anterior, puede usar una lista de comprensión:
bar = [x * 2 for x in bar]
O puede usar el map
:
def double(x):
return x * 2
bar = map(double, bar)
en realidad no cambiaste la lista en absoluto. lo primero que hizo loop fue asignar bar [0] a foo (equivalente a foo = bar [0]). foo es solo una referencia a 1. Luego asigna otra onject 0 a foo. Esto cambió la referencia de foo a 0. Pero no cambiaste la barra [0]. Recuerde, foo como variable, hace referencia a la barra [0], pero asigna otro valor / objeto a foo y no afecta a la barra [0] en absoluto.
bar = [0 for x in bar]
Respuesta larga: foo
es solo un nombre local, la reenlace no afecta la lista. Las variables de Python son realmente solo la clave: pares de valores, no nombres simbólicos para ubicaciones de memoria.