una - lista de python por valor no por referencia
python lista como parametro (11)
Además, puedes hacer:
b = list(a)
Esto funcionará para cualquier secuencia, incluso aquellas que no admiten indexadores y sectores ...
Esta pregunta ya tiene una respuesta aquí:
- Cómo clonar o copiar una lista? 18 respuestas
Tomemos un ejemplo
a=[''help'', ''copyright'', ''credits'', ''license'']
b=a
b.append(''XYZ'')
b
[''help'', ''copyright'', ''credits'', ''license'', ''XYZ'']
a
[''help'', ''copyright'', ''credits'', ''license'', ''XYZ'']
Quise agregar valor en la lista ''b'' pero el valor de la lista ''a'' también ha cambiado.
Creo que tengo poca idea de por qué es así (Python pasa listas por referencia).
Mi pregunta es "¿cómo puedo pasarla por valor para que al agregar ''b'' no cambie los valores en ''a''?"
Como lo menciona phihag en su respuesta,
b = a[:]
funcionará para su caso ya que dividir una lista crea una nueva identificación de memoria de la lista (lo que significa que ya no hace referencia al mismo objeto en su memoria y que los cambios que realice en uno no se reflejarán en el otro).
Sin embargo, hay un pequeño problema. Si su lista es multidimensional, como en listas dentro de listas, simplemente rebanar no resolverá este problema. Los cambios realizados en las dimensiones superiores, es decir, las listas dentro de la lista original, se compartirán entre los dos.
No te preocupes, hay una solución. La copia del módulo tiene una ingeniosa técnica de copia que soluciona este problema.
from copy import deepcopy
b = deepcopy(a)
copiará una lista con una nueva identificación de memoria sin importar cuántos niveles de listas contenga.
Como se responde en las preguntas frecuentes oficiales de Python :
b = a[:]
Cuando haces b = a
simplemente creas otro puntero al mismo recuerdo de a , es por eso que cuando anexas a b , también cambia.
Necesitas crear una copia de a y eso se hace así:
b = a[:]
Descubrí que podemos usar extender () para implementar la función de copiar ()
a=[''help'', ''copyright'', ''credits'', ''license'']
b = []
b.extend(a)
b.append("XYZ")
En términos de rendimiento, mi respuesta favorita sería:
b.extend(a)
Compruebe cómo se comparan las alternativas relacionadas entre sí en términos de rendimiento:
In [1]: import timeit
In [2]: timeit.timeit(''b.extend(a)'', setup=''b=[];a=range(0,10)'', number=100000000)
Out[2]: 9.623248100280762
In [3]: timeit.timeit(''b = a[:]'', setup=''b=[];a=range(0,10)'', number=100000000)
Out[3]: 10.84756088256836
In [4]: timeit.timeit(''b = list(a)'', setup=''b=[];a=range(0,10)'', number=100000000)
Out[4]: 21.46313500404358
In [5]: timeit.timeit(''b = [elem for elem in a]'', setup=''b=[];a=range(0,10)'', number=100000000)
Out[5]: 66.99795293807983
In [6]: timeit.timeit(''for elem in a: b.append(elem)'', setup=''b=[];a=range(0,10)'', number=100000000)
Out[6]: 67.9775960445404
In [7]: timeit.timeit(''b = deepcopy(a)'', setup=''from copy import deepcopy; b=[];a=range(0,10)'', number=100000000)
Out[7]: 1216.1108016967773
Para copiar una lista, puede usar list(a)
or a[:]
. En ambos casos, se crea un nuevo objeto.
Estos dos métodos, sin embargo, tienen limitaciones con las colecciones de objetos mutables, ya que los objetos internos mantienen sus referencias intactas:
>>> a = [[1,2],[3],[4]]
>>> b = a[:]
>>> c = list(a)
>>> c[0].append(9)
>>> a
[[1, 2, 9], [3], [4]]
>>> c
[[1, 2, 9], [3], [4]]
>>> b
[[1, 2, 9], [3], [4]]
>>>
Si desea una copia completa de sus objetos, debe copy.deepcopy
>>> from copy import deepcopy
>>> a = [[1,2],[3],[4]]
>>> b = a[:]
>>> c = deepcopy(a)
>>> c[0].append(9)
>>> a
[[1, 2], [3], [4]]
>>> b
[[1, 2], [3], [4]]
>>> c
[[1, 2, 9], [3], [4]]
>>>
Para crear una copia de una lista, haga esto:
b = a[:]
Si desea copiar una lista unidimensional, use
b = a[:]
Sin embargo, si a
es una lista bidimensional, esto no va a funcionar para usted. Es decir, cualquier cambio en a
también se reflejará en b
. En ese caso, use
b = [[a[x][y] for y in range(len(a[0]))] for x in range(len(a))]
Yo recomendaría la siguiente solución:
b = []
b[:] = a
Esto copiará todos los elementos de a a b. La copia será una copia de valor, no una copia de referencia.
b = list(a)