En Python, he visto dos valores variables intercambiados usando esta sintaxis:
left, right = right, left
¿Se considera esta la forma estándar de intercambiar dos valores de variables o hay algún otro medio por el cual dos variables se intercambian por convención más habitualmente?
python
syntax
swap
conventions
WilliamKF
fuente
fuente
Respuestas:
Eso significa lo siguiente para la expresión
a,b = b,a
:b,a
se evalúa el lado derecho , 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 se fomente la instrucción durante la ejecución del programa.a
se asigne al primer elemento de la tupla (que es el objeto que antes era b antes del intercambio porque tenía nombreb
)y el el segundo identificador
b
se asigna al segundo elemento de la tupla (que es el objeto que anteriormente era un antes del intercambio porque sus identificadores erana
)Este mecanismo ha intercambiado efectivamente los objetos asignados a los identificadores
a
yb
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.
fuente
a, b, c = c, a, b
.Esa es la forma estándar de intercambiar dos variables, sí.
fuente
Sé tres formas de intercambiar variables, pero
a, b = b, a
es la más simple. Ahi estaXOR (para enteros)
O concisamente
Variable temporal
Tuple swap
fuente
code
x = x + aa = xy x = xycode
No diría que es una forma estándar de intercambio porque provocará algunos errores inesperados.
nums[i]
se modificará primero y luego afectará a la segunda variablenums[nums[i] - 1]
.fuente
var c=a
,a=b
,b=c
. Y luego, la última asignación utilizará el nuevo valor dea
para evaluar la dirección de b.nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
. Resolvería el problema.nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
: El problema es cuando python hace la asignación del lado izquierdo,nums[i]
se cambia, lo que provoca unnums[nums[i] - 1]
cambio inesperado. Puedes imaginarte al principio que quieresnums[1],nums[2] = nums[2],nums[1]
, pero después denums[1] = nums[2]
correr, ya no tienesnums[2] = nums[1]
, sino que tienesnums[888] = nums[1]
.No funciona para matrices multidimensionales, porque aquí se usan referencias.
Ver también Intercambiar rebanadas de matrices Numpy
fuente
Para evitar los problemas explicados por eyquem , puede usar el
copy
módulo para devolver una tupla que contiene copias (invertidas) de los valores, a través de una función:La misma función que un
lambda
:Luego, asigne esos a los nombres deseados, así:
NOTA: si lo desea, puede importar / usar en
deepcopy
lugar decopy
.fuente
Se pueden combinar tuplas y XOR permutas: x, y = x ^ x ^ y, x ^ y ^ y
o
Usando lambda :
Salida:
fuente