Precauciones diccionario de Python

# 代码一
list1 = []
dict1 = {}
for i in range(5):
    dict1 = {"one": i}
    list1.append(dict1)
print(list1) # [{'one': 0}, {'one': 1}, {'one': 2}, {'one': 3}, {'one': 4}]

# 看一下列表的id值
for id_value in map(lambda x: id(x), list1):
    print(id_value)
entiendo
  • Fuera del bucle crea un diccionario vacío y una variable y asignación. Sabemos que en Python, un objeto es en realidad una referencia a la asignación de un objeto, es decir, cuando una variable a otra asignación de variables, la transferencia de la dirección, también lo hará dict1esta variable y {}el diccionario vacío agrupados, o dict1señalador{}

  • Cada vez que el diccionario se crea en el bucle {"one": i}se abrirá un nuevo espacio en la memoria utilizada para almacenar el diccionario, y cada una de las misiones y lo hará dict1esta variable a punto para el nuevo diccionario como{"one":0}

  • A continuación, list1llevar a cabo appendla operación, supongo (ya confirmada) operación de anexión se lleva a cabo, en realidad se agrega 该对象的引用, por lo que cada vez que se añada cada diccionario (referencias) dirección de memoria del entrantelist1

  • Vistazo a list1la identificación (que puede volver a identificar de manera única un objeto) ['1593305955784','1593305955496','1593306802432'...], prestar atención a la parte interior de la identificación no son los mismos

  • La lista contiene la dirección de memoria de los diferentes diccionarios, generando así una lista final es una lista de los valores respectivos no son los mismos

 
 
 

# 代码二
list2 = []
dict2 = {}
for i in range(5):
    dict2["one"] = i
    print(dict2) # 依次输出 {'one': 0},{'one': 1},{'one': 2},{'one': 3},{'one': 4}
    list2.append(dict2)
print(list2) # [{'one': 4}, {'one': 4}, {'one': 4}, {'one': 4}, {'one': 4}]

# 看一下列表的id值
for id_value in map(lambda x: id(x), list1):
    print(id_value)

entiendo

  • La salida puede verse, dict2["one"] = icada vez que el diccionario acaba de dict2modificar el resultado final de la última modificación retenida, y no como un nuevo diccionario como un Código
  • Trate de analizar el proceso de
    • En primer lugar abrir un diccionario y asignado al área de ventilación en la memoria dict2(de referencia)
       
    • Modificación de cada ciclo dict2pieza zona puntiaguda
       
    • Después de la dict2memoria a la que apunta la dirección de datos anexados a la memoria diccionario list2en
       
    • Pero cada vez dict2["one"] = iy ningún nuevo diccionario es siempre en el diccionario valuereescritura, y ningún nuevo diccionario, un diccionario está sólo empezando a extremo, por lo que cada vez que append es la misma dirección de memoria
       
    • Podemos utilizar para mirar esta lista de ID , ['2966419766368','2966419766368','2966419766368'...], encontramos que ID es el mismo
       
    • Porque desde un valor corresponde a una sola llave, una tecla varias veces en el valor, el valor de este último se sobreponen a la parte delantera, por lo que el último list2valor del valor de la última modificación al diccionario para prevalecer. La lista contiene la misma dirección de memoria, generando así una lista final es una lista de valores respectivos son los mismos

 
copia superficial copiar sólo la referencia de objeto, se presenta esta situación se puede resolver profunda copiar
 
 
contenido antes mencionado representa sólo puntos de vista personales, no autorizadas, se parecen a ...

Supongo que te gusta

Origin www.cnblogs.com/NoTrace/p/12580652.html
Recomendado
Clasificación