sentencias - tipos de variables en python
¿Existe un método estandarizado para intercambiar dos variables en Python? (5)
En Python, he visto dos valores de variables intercambiados usando esta sintaxis:
left, right = right, left
¿Se considera que esta es la forma estándar de intercambiar dos valores variables o hay otros medios por los cuales las dos variables se intercambian por convención generalmente?
Python evalúa expresiones de izquierda a derecha. Observe que al evaluar una asignación, el lado derecho se evalúa antes que el lado izquierdo.
http://docs.python.org/3/reference/expressions.html#evaluation-order
Eso significa lo siguiente para la expresión a,b = b,a
:
- El lado derecho
b,a
se evalúa, es decir, se crea una tupla de dos elementos en la memoria. Los dos elementos son los objetos designados por los identificadoresb
ya
, que existían antes de que la instrucción se encuentre durante una ejecución del programa - Justo después de la creación de esta tupla, aún no se ha realizado ninguna asignación de este objeto de tupla, pero no importa, Python sabe internamente dónde está
- luego, se evalúa el lado izquierdo, es decir, la tupla se asigna al lado izquierdo
- como el lado izquierdo está compuesto por dos identificadores, la tupla se desempaqueta para que el primer identificador se asigne al primer elemento de la tupla (que es el objeto que estaba formalmente antes del intercambio porque tenía el nombre
b
)
y el segundo identificadorb
se asigna al segundo elemento de la tupla (que es el objeto que anteriormente era a antes del intercambio porque sus identificadores erana
)
Este mecanismo ha intercambiado efectivamente los objetos asignados a los identificadores a
y b
Entonces, para responder a su pregunta: SÍ, es la forma estándar de intercambiar dos identificadores en dos objetos.
Por cierto, los objetos no son variables, son objetos.
Conozco tres formas de intercambiar variables, pero a, b = b, a
es la más simple. Ahi esta
XOR (para enteros)
x = x ^ y
y = y ^ x
x = x ^ y
O concisamente,
x ^= y
y ^= x
x ^= y
Variable temporal
w = x
x = y
y = w
del w
Intercambio de tuplas
x, y = y, x
Esa es la forma estándar de intercambiar dos variables, sí.
No diría que es una forma estándar de intercambio porque causará algunos errores inesperados.
nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
nums[i]
se modificará primero y luego afectará a la segunda variable nums[nums[i] - 1]
.
No funciona para matrices multidimensionales, porque las referencias se utilizan aquí.
import numpy as np
# swaps
data = np.random.random(2)
print(data)
data[0], data[1] = data[1], data[0]
print(data)
# does not swap
data = np.random.random((2, 2))
print(data)
data[0], data[1] = data[1], data[0]
print(data)
Véase también Intercambiar rodajas de matrices numpy