y = raw_input('Enter a number:')
print type y
y = float(raw_input('Enter a number:'))
print type y
I'm assuming that y is an object.
Rather than thinking that y "is" an object, it is more accurate
to think of it as: y is a name that is "bound" to (ie, refers to,
points to) an object.
So, raw_input() creates a string object and returns it. Your
first assignment statement binds that string object to the name
"y". From now on, when you refer to "y" you will get that
string object.
When python executes your 3rd line, raw_input() creates a new
string object, completely separate from the earlier one. This
object is passed to float(). Float() reads it and creates a
new float object and returns it. When python then executes
your second assignment statement, it changes the binding of "y"
to point to the float object; the old binding to the string
object is lost. From now on, when you refer to "y" you will
get the float object.
I'm also assuming that the second and the first y are different
objects because they have different types.
Yes, they are different objects. But not because they have
different types; they are different because every time python
creates a new object it is distinct from other objects [*1].
The second time we type
print type y, how does the program knows which one of the y's it
refers to ?
Because there is only one name "y", and when python executed
your second assignment statement, it changed the object that
the name y pointed to from the first (string) object to the
second (float) one.
Is the first y object deleted ? thanks in advance.
Yes. If there is no way that the first object can be accessed
any more, then it will be deleted. The same thing happened to
the string object return by raw_input() in your 3rd statement
(which never had a name at all).