Hablando sobre el uso del método list.copy en python

 

Este artículo presenta principalmente la información relevante sobre el uso del método list.copy en python. El artículo también presenta la diferencia entre python list.copy() y copy.deepcopy(). Los amigos que lo necesiten pueden consultar lo siguiente

Cuando queremos copiar dos listas idénticas, podemos usar el método list.copy(), que nos permite copiar una matriz idéntica.Cuando nos encontramos con la siguiente situación, podemos encontrar algunos problemas

1

2

3

4

5

# _*_coding='utf8'_*_

nameList = [1, 2, 3, 4, 5]

nameList1 = nameList.copy()

nameList[1] = 55

print(nameList, nameList1)

En este momento, cuando se imprimen nameList y nameList1, los elementos de las dos listas son los siguientes

[1, 55, 3, 4, 5] [1, 2, 3, 4, 5]

Puedes ver que el segundo elemento de la lista es diferente

Esto se debe a que cuando se ejecuta la función list.copy() en python, no apunta a la dirección de nameList en la memoria, sino a una nueva copia. En este momento, las direcciones de las dos listas en la memoria son diferentes. Podemos imprimirlo

Use el siguiente código para ver que la memoria de las dos listas ya es diferente

1

2

3

4

nameList = [1, 2, 3, [3, 4, 5], 4, 5]

nameList1 = nameList.copy()

nameList[1] = 55

print(id(nameList), id(nameList1))

2207528867520 2207531826048

En este momento, el nameList[1] = 55 modificado no tendrá efecto en nameList1

Y cuando haya una matriz en la lista de nombres, la situación cambiará nuevamente.

1

2

3

4

5

# _*_coding='utf8'_*_

nameList = [1, 2, 3, [3, 4, 5], 4, 5]

nameList1 = nameList.copy()

nameList[3][2] = 55

print(nameList, nameList1)

Ingresa el siguiente contenido

[1, 2, 3, [3, 4, 55], 4, 5] [1, 2, 3, [3, 4, 55], 4, 5]

Se puede ver que las matrices anidadas en las dos listas han cambiado. Esto se debe a que la lista bidimensional almacenada en la lista en realidad almacena la dirección de la lista bidimensional en la memoria. Cuando se modifica una de las listas, la otra Naturalmente, también se verá afectado, así que verifiquemos si es la dirección de memoria almacenada.

De manera similar, usamos el método id() para recuperar la dirección de memoria

1

2

3

4

5

# _*_coding='utf8'_*_

nameList = [1, 2, 3, [3, 4, 5], 4, 5]

nameList1 = nameList.copy()

nameList[3][2] = 55

print(id(nameList[3]), id(nameList1[3]))

generar lo siguiente

2879859422336 2879859422336

Se puede ver que las dos direcciones de memoria son las mismas

Este es el final de la introducción del método de copia.

Suplemento: diferencia entre python list.copy() y copy.deepcopy()

Por ejemplo

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

dieciséis

17

18

19

20

21

import copy

class ListNode:

    def __init__(self, x):

        self.val = x

        self.next = None

    def __repr__(self):

        return str(self.val)

list1 = [ListNode(1), ListNode(2)]

list2 = list1.copy()

list3 = list1[:]

list4 = copy.deepcopy(list1)

print(list1, list2, list3, list4)

# [1, 2] [1, 2] [1, 2] [1, 2]

list1[0].val = 5

print(list1, list2, list3, list4)

# [5, 2] [5, 2] [5, 2] [1, 2]

list1.append(ListNode(10))

print(list1, list2, list3, list4)

# [5, 2, 10] [5, 2] [5, 2] [1, 2]

print(id(list1[0]),id(list2[0]),id(list3[0]),id(list4[0]))

# 1984073709792 1984073709792 1984073709792 1984073707824

explicar

  • lista1 es la matriz original
  • Tanto la lista 2 como la lista 3 son copias superficiales de la lista 1. ¿Qué significa copia superficial?

python的list里面存的都是引用,如果存的是listnode,实际上存的是listnode的引用,也就是地址,毕竟如果listnode里存了很多关于这个node的信息的话,直接在list里面存这段信息的地址就很方便,等到要用这段信息的时候(比如list1[0].val),只要找到地址(list1[0])再到这段地址取值(.val)就可以了。

浅拷贝的意思是,开辟一段内存,这段内存里复制了原list的地址。

地址还是那个地址,所以可以看出**id(list1[0]),id(list2[0])**是完全一样的。这会带来的问题是,当我们把这段地址里的值.val变化一下(list1[0].val = 5), 浅拷贝的数组里对应元素的值也就跟着变了

深拷贝就厉害了,不光把原数组存的地址拷贝了,就连原数组地址里对应的数据也都进行了复制,所以可以看到**id(list1[0]),id(list4[0])**变得不一样了。

转自:微点阅读   https://www.weidianyuedu.com

Supongo que te gusta

Origin blog.csdn.net/weixin_45707610/article/details/131878086
Recomendado
Clasificación