swap 2 variables
>>> a = 1
>>> b = 2
>>> a
2
>>> b
1
reason :
In other languages you need to keep an intermediate variable to accomplish this.
reference:
https://stackoverflow.com/questions/14836228/is-there-a-standardized-method-to-swap-two-variables-in-python/14836456#14836456
In python , two variables values swapped using this syntax:
left, right = right, left
Python evaluates expressions from left to right. Notice that while evaluating an assignment, the right-hand side is evaluated before the left-hand side.
That means the following for the expression a,b = b,a :
- The right-hand side
b,ais evaluated, that is to say, a tuple of two elements is created in the memory. The two elements are the objects designated by the identifiersbanda, that were existing before the instruction is encountered during the execution of the program. - Just after the creation of this tuple, no assignment of this tuple object has still been made, but it doesn't matter, Python internally knows where it is.
- Then, the left-hand side is evaluated, that is to say, the tuple is assigned to the left-hand side.
- As the left-hand side is composed of two identifiers, the tuple is unpacked in order that the first identifier
abe assigned to the first element of the tuple (which is the object that was formerly b before the swap because it had nameb)
and the second identifierbis assigned to the second element of the tuple (which is the object that was formerly a before the swap because its identifiers wasa)
This mechanism has effectively swapped the objects assigned to the identifiers a and b
So, to answer your question: YES, it's the standard way to swap two identifiers on two objects.
By the way, the objects are not variables, they are objects.
I know three ways to swap variables, but a, b = b, a is the simplest. There is
XOR (for integers)
x = x ^ y
y = y ^ x
x = x ^ y
Or concisely,
x ^= y
y ^= x
x ^= y
Temporary variable
w = x
x = y
y = w
del w
Tuple swap
x, y = y, xI would not say it is a standard way to swap because it will cause some unexpected errors.
nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
nums[i] will be modified first and then affect the second variable nums[nums[i] - 1].
Does not work for multidimensional arrays, because references are used here.
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)
To get around the problems explained by eyquem, you could use the copy module to return a tuple containing (reversed) copies of the values, via a function:
from copy import copy
def swapper(x, y):
return (copy(y), copy(x))
Same function as a lambda:
swapper = lambda x, y: (copy(y), copy(x))
Then, assign those to the desired names, like this:
x, y = swapper(y, x)
NOTE: if you wanted to you could import/use deepcopy instead of copy.
exceptions / challenges on the syntax
No comments:
Post a Comment