This question has been raised because of a certain example I encountered while reading about actual and formal arguments. Let x and y be 2 non-iterable variables

```
def fun(y):
    x=y
    x=3

y=5
fun(y)
print y 
#yields 5 and hence I have been led to believe that 2 separate copies of x and y exist wherein if a change is made to x ,nothing is reflected in y.

```

However if y were a list and a value were to be changed in the function,the changes would be reflected outside the function as well.

```
def func(a):
    x = a
    x[0]="abhi"

a = ["ari", "gold", "silver"]
func(a)
print a

 # yields ["abhi", "gold", "silver"]

```

Why the discrepancy in the definition of x=y when it comes to lists and normal variables ?