Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

python byRef // copy

Tags:

python

I am new to Python (and dont know much about programming anyway), but I remember reading that python generally does not copy values so any statement a = b makes b point to a. If I run

a = 1
b = a
a = 2
print(b)

gives the result 1. Should that not be 2?

like image 849
user1266138 Avatar asked Jul 27 '12 14:07

user1266138


2 Answers

No, the result should be 1.

Think of the assignment operator ( = ) as the assignment of a reference.

a = 1 #a references the integer object 1
b = a #b and a reference the same object
a = 2 #a now references a new object (2)
print b # prints 1 because you changed what a references, not b

This whole distinction really is most important when dealing with mutable objects such as lists as opposed to immutable objects like int,float and tuple.

Now consider the following code:

a=[]  #a references a mutable object
b=a   #b references the same mutable object
b.append(1)  #change b a little bit
print a # [1] -- because a and b still reference the same object 
        #        which was changed via b.
like image 189
mgilson Avatar answered Sep 22 '22 13:09

mgilson


When you execute b = a, it makes b refer to the same value a refers to. Then when you execute a = 2, it makes a refer to a new value. b is unaffected.

The rules about assignment in Python:

  1. Assignment simply makes the name refer to the value.

  2. Assignment to a name never affects other names that refer to the old value.

  3. Data is never copied implicitly.

like image 22
Ned Batchelder Avatar answered Sep 20 '22 13:09

Ned Batchelder