una nueva insertar filas fila data crear columna agregar python list loops object instance

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.