class 12th computer science
Answers
Answer:
Stack Overflow
sign up log in
By using our site, you acknowledge that you have read and understand our Cookie Policy, Privacy Policy, and our Terms of Service.
Questions Jobs Tags Users Badges Ask
Up vote
10
Down vote
Python swapping lists
python list iterable-unpacking python-internals
In python, when I assign a list to another, like:
a = [1,2,3]
b = a
Now b and a point to the same list. Now considering two lists,
a = [1,2,3]
b = [4,5,6]
a,b = b,a
Now how is it that they are swapped like any other data type and does not end up both pointing to the same list?
share improve this question follow
asked
Dec 14 '13 at 11:57
Aswin Murugesh
9,210●1010 gold badges●3333 silver badges●6363 bronze badges edited
Dec 15 '13 at 4:27
thefourtheye
198k●3737 gold badges●392392 silver badges●440440 bronze badges
3 Answers
order by
votes
Up vote
9
Down vote
Accepted
Looks like Python internally swaps the items. Check this program
a, b = [1, 2], [2, 3]
def func():
a, b = b, a
import dis
dis.dis(func)
Output
4 0 LOAD_FAST 0 (b)
3 LOAD_FAST 1 (a)
6 ROT_TWO
7 STORE_FAST 1 (a)
10 STORE_FAST 0 (b)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
So, Python pushes references from b and a in the stack with LOAD_FAST. So, now the top most element is the reference pointed by a and the next one is the reference pointed by b. Then it uses ROT_TWO to swap the top two elements of the stack. So, now, the top most element is the reference pointed by b and the next one is the reference pointed by a and then assigns the top two elements of the stack to a and b respectively with STORE_FAST.
That's how sorting is happening in the assignment statement, when the number of items we deal with is lesser than 4.
If the number of items is greater than or equal to four, it builds a tuple and unpacks the values. Check this program
a, b, c, d = [1, 2], [2, 3], [4, 5], [5, 6]
def func():
a, b, c, d = d, c, b, a
import dis
dis.dis(func)
Output
4 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (c)
6 LOAD_FAST 2 (b)
9 LOAD_FAST 3 (a)
12 BUILD_TUPLE 4
15 UNPACK_SEQUENCE 4
18 STORE_FAST 3 (a)
21 STORE_FAST 2 (b)
24 STORE_FAST 1 (c)
27 STORE_FAST 0 (d)
30 LOAD_CONST 0 (None)
33 RETURN_VALUE
share improve this answer follow
answered
Dec 14 '13 at 11:59
thefourtheye
198k●3737 gold badges●392392 silver badges●440440 bronze badges edited
Dec 14 '13 at 13:01
@MartijnPieters That's why I had to make references in bold. – thefourtheye Dec 14 '13 at 12:51
@MartijnPieters Got you :) Please check my updated answer, including the tuple unpacking stuff. – thefourtheye Dec 14 '13 at 12:56
1
As