confusion with the reverse() function in python .why does it reverse both of the list in this specific question

Question:

Q3. Consider the following Python function:

def maf(x):
 """ (list)->bool """
 temp = x
 temp.reverse()
 if temp == x:
 return True
 else:
 return False

If we call the function maf with the list a and then with the list b with the values give bellow:
a = [17, 38, 10, 25, 72]
b = [10, 30, 20, 30, 10]
What is the value returned by each call?
Answers (choose one):
a) maf(a) returns True and maf(b) returns True
b) maf(a) returns True and maf(b) returns False
c) maf(a) returns False and maf(b) returns True
d) maf(a) returns False and maf(b) returns False
I don’t understand why the answer is a). in my understanding, only the temp variable changes while the x stays the same. thys why is the output true in both cases ?
I went to python after and wrote this :

x = [17,2,1]
temp = x
temp.reverse()
print(temp)
print(x)  

The output was this :
[1, 2, 17]
[1, 2, 17]
why did x also get reversed when we only reversed temp ?
please give me a detailed explanation.

Asked By: user20194358

||

Answers:

in my understanding, only the temp variable changes while the x stays the same

temp = x makes the two variables refer to the same object. You can check that yourself:

print(x is temp)
# Prints "True"

For them to be separate, you would need to make a copy of x, then assign that to temp.

Answered By: Carcigenicate
temp = x

temp is x – you’re not making a copy, you’re just creating a second reference to the same object.

You can make a shallow copy with

temp = x[:]

If the list x has more than one dimension, you’ll need to make a deep copy, like this:

import copy
temp = copy.deepcopy(x)

Check out the copy docs here, with more info on shallow & deep copies.

Answered By: Danielle M.

The short answer to that is mutability in python (here’s a good URL to read up more about it: https://www.mygreatlearning.com/blog/understanding-mutable-and-immutable-in-python/). I’ll try my best to explain in short terms.

When you assign a variable in python using the following syntax:

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

Under the hood, python is simply using a pointer to refer to the same memory address that stores the created list. This can be seen using the in-built id function in python:

id(a)
id(temp)

The id function returns the identity (or memory address for Cython, the default Python installation) of the object. You will see that the memory addresses for both variables are the same, meaning they are pointing to the same list even though they are different variables.

Thus, when you call .reverse() on the variable a, the list gets updated in place (you can call id again after calling reverse, notice that the memory address of a before and after the reverse function is the same). Since the variable temp also refers to the same memory address, temp is also now referring to the reversed list.

Answered By: Lee Kai Xuan