Copia profunda y superficial de listas de Python

Tabla de contenido

descripción general

= copiar

Función de lista copiar () copiar

[:]Copiar

Demostración de cambios en la estructura de la lista

función de copia profunda

Qué es copia superficial y copia profunda y cuál es la diferencia entre los dos

Resumir


descripción general

Las listas de Python se pueden copiar, pero hay una copia superficial y una copia profunda. Creo que algunas personas no entienden qué es una copia profunda y una copia superficial. Hablemos de eso hoy.

= copiar

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author: rex.cheny
# E-mail: [email protected]

list1 = ["A", "B"]

list2 = list1

print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))
list2.append("C")
print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))

Al agregar un elemento a list2 y verificar los resultados de la operación, se encuentra que ambas listas han cambiado. Entonces, el signo = es la copia más simple de la lista, pero no se puede contar como copia, porque puede ver que las ID de las dos listas son las mismas.

Función de lista copiar () copiar

Cambiemos la forma de copiar

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author: rex.cheny
# E-mail: [email protected]

list1 = ["A", "B"]

list2 = list1.copy()

print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))
list2.append("C")
print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))

Aquí es donde realmente se copian las copias, porque sus identificaciones son diferentes. Mirando los resultados de ejecución, se encuentra que solo list2 ha cambiado, pero es una copia superficial.

[:]Copiar

Veamos otra forma de copiar. De hecho, estrictamente hablando, dividir no es una copia. Después de dividir la lista, se devolverá una nueva lista y la lista original permanecerá sin cambios.

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author: rex.cheny
# E-mail: [email protected]

list1 = ["A", "B"]

list2 = list1[:]

print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))
list2.append("C")
print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))

El resultado es el mismo que el anterior.

Lo anterior demuestra 3 ejemplos, pero solo el segundo método de copia pertenece a la copia superficial. Puede preguntarse, si ya se han copiado, ¿cómo puede haber una copia profunda?

Demostración de cambios en la estructura de la lista

Aquí todavía usamos la función de copiar, esta función es la misma que usar [:], hay 2 cambios a continuación

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author: rex.cheny
# E-mail: [email protected]

# 在列表中添加一个列表元素
list1 = ["A", "B", [1, 2]]

list2 = list1[:]

print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))
# 这里我们修改列表中的列表,对内层列表进行修改
list2[2].append("C")
print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))

Si observa los resultados de la ejecución, encontrará que la lista interna se ha modificado. Has leído bien. Sigue mirando hacia abajo.

Entonces, ¿qué pasa si realmente se copia de forma independiente y no interfiere entre sí en este escenario de lista anidada? Esto utiliza una copia profunda.

función de copia profunda

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
# Author: rex.cheny
# E-mail: [email protected]

# 导入该模块
import copy

# 在列表中添加一个列表元素
list1 = ["A", "B", [1, 2]]

# 深复制
list2 = copy.deepcopy(list1)

print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))
# 这里我们修改列表中的列表,对内层列表进行修改
list2[2].append("C")
print("list1: ", list1, "ID: ", id(list1))
print("list2: ", list2, "ID: ", id(list2))

Compruebe los resultados de la ejecución, como se esperaba.

Qué es copia superficial y copia profunda y cuál es la diferencia entre los dos

De hecho, desde el punto de vista del efecto, debe comprender la diferencia entre los dos, pero si desea hablar sobre este problema, debe hablar sobre el tipo de datos.Hay dos tipos de tipos de datos:

  • Tipos de datos básicos, incluidos cadena, número, booleano. Lo que se almacena son datos reales.
  • El tipo de datos de objeto (tipo de datos de referencia) es un objeto, una instancia de una clase, que almacena una referencia a un objeto.

¿Qué significa la instrucción de asignación =? Por ejemplo, la instrucción de asignación name = "tom" (=) es vincular el nombre de la variable a un objeto de memoria. Si el objeto existe, se vinculará directamente. Si no existe, se creará y vinculará primero. name almacena el puntero a "tom", y el área de memoria que almacena tom almacena los datos reales de tom; lista1 = [1, 2] Este tipo de lista1 almacena el puntero del objeto de lista, pero el objeto de lista en sí no almacena Los datos son una referencia a otros objetos. La lista aquí contiene dos objetos, 1 y 2. Estos dos objetos realmente existen en la memoria. El objeto de lista solo se refiere a estos objetos, y la lista es solo una organización de datos. forma.

Copia superficial: copie el puntero, los datos son solo una copia en la memoria, pero solo se copia un nivel de objeto, si hay otro tipo de datos de referencia, no funcionará

Copia profunda: puede entenderse como una copia superficial recursiva

Si todavía no entiendes, mira la imagen de abajo.

La siguiente figura es el diagrama después de usar copia profunda

Resumir

Si quieres generar dos listas que no interfieran entre sí, usa deepcopy, y puedes elegir en otros casos.

Supongo que te gusta

Origin blog.csdn.net/weixin_47649808/article/details/126388458
Recomendado
Clasificación