Pregunta comprensión de la asignación de variables de python [duplicado]


Esta pregunta ya tiene una respuesta aquí:

Estoy tratando de enseñarme Python (y la programación en general) y estoy un poco confundido acerca de la asignación de variables. Entiendo que si tengo

>>> a = [1,2,3]
>>> b = a

ese b se refiere al mismo objeto en la memoria como a hace. Entonces, si quería crear una nueva lista, b, con los mismos valores que a actualmente tiene, ¿cómo lo lograría?

Además, considere este ejemplo:

>>> a = [1, 2, 3]
>>> b = a
>>> x = a[1]
>>> a[1] = 4
>>> print a, b, x
[1, 4, 3] [1, 4, 3] 2

Veo en este ejemplo, que x es un objeto nuevo, pero b puntos a a. ¿Podría alguien explicarme qué está pasando aquí, por qué? x es un objeto nuevo, pero b no es?


7
2018-03-27 17:28


origen


Respuestas:


Considera este ejemplo:

In [20]: a = [[1], [2], [3]]

In [21]: b = a

In [22]: x = a[1]

In [23]: a
Out[23]: [[1], [2], [3]]

In [24]: b
Out[24]: [[1], [2], [3]]

In [25]: x
Out[25]: [2]

In [26]: a[1][0] = 4

In [27]: a
Out[27]: [[1], [4], [3]]

In [28]: b
Out[28]: [[1], [4], [3]]

In [29]: x
Out[29]: [4]

La diferencia aquí es que cuando jugamos con a[1] lo hicimos por modificándolo en lugar de decir a[1] para referirse a algo completamente nuevo.

En tu caso, cuando dijiste x para referirse a lo que sea a[1] se refiere a, tomó una referencia a algo concreto, lo que sea que estaba en a[1] en ese momento, en tu caso, un entero específico.

Más tarde cuando le dijiste a[1] para cambiar, sí cambió. Pero lo que solía referirse no dejaba de existir (porque x todavía estaba allí refiriéndose a eso).

Diciendo x = a[1] usted no está diciendo x siempre se referirá a lo que sea a[1] se refiere a.

Tu estas diciendo x se referirá a lo que sea a[1] se refiere a en este momento de la asignación.

Lo mismo es cierto para b también, es solo que lo "concreto" que b se le dijo que se refiriera a una lista completa, que puede tener un contenido cambiante.

Otro ejemplo:

a = [1, 2, 3,]
b = a

print a, b

# Prints
#[1, 2, 3]
#[1, 2, 3]

a = [4, 5, 6]

print a, b

# Prints
#[4, 5, 6]
#[1, 2, 3]

1
2018-03-27 17:40



La respuesta a la segunda pregunta es que cuando x = a[1] x está apuntando al objeto que está en a[1]no a[1].

Cuando cambias a[1] cambias el objeto que a[1] apunta hacia, no el objeto en sí. Sin embargo, x todavía apunta al objeto viejo.

Espero haber explicado eso claramente. Si no comentario

EDITAR: Exactamente lo que dijo @jonrsharpe.


1
2018-03-27 17:39



La diferencia aquí es que a es un list, que es mutable (es decir, puede cambiarse en su lugar), pero a[1] es un int, que es inmutable (es decir, no se puede cambiar en su lugar). a[1] = 4 reemplaza 2 con 4 en el list, pero x todavía está apuntando a la 2. - @ jonrsharpe

b = a[:]

Creará un clon de a ese es un objeto diferente Hacemos esto porque lists son mutables, por lo que cuando técnicamente estamos tomando una sección de otra lista como estamos aquí, puede referirse a un nuevo objeto.


1
2018-03-27 17:44



También soy nuevo en Python. Basado en lo que entendí hasta ahora todo en Python es un objeto y las variables son meras referencias a estos objetos.

Entonces b = a significa que b apunta al mismo objeto que a.

Sin embargo, hay dos tipos de objetos mutables e inmutables. La lista es un objeto mutable, lo que significa que la lista real referenciada por a y b en su código puede ser modificada. Por lo tanto, puede ver que cuando realiza un cambio en un cambio efectivo de la lista subyacente, este cambio b también.

Para crear una lista b completamente nueva, puede usar b = a [:]


0
2018-03-27 17:52