Válas Péter wrote:
Being one of the purposes of Python to be a simple educational language, I
want to make this simple to a beginner who does care. :-)
Here is a piece of code, Python 3.1.2, a small game with a list and a tuple:
li=[3,4]
id(li)
13711200
la=li
id(la)
13711200
You can make it simpler by ignoring id() and using the `is` operator
instead. `is` is equivalent to this function:
def my_is(a, b):
return id(a) == id(b)
Of course you don't need to use that, instead do this:
>>> a = [1, 2, 3]
>>> b = a
>>> a is b
True
My question is: how would you explain the different behaviour of a list and
a tuple for a beginner?
Lists are mutable, which means you can change them in-place. The *=
command changes the list in place:
>>> a = [1, 2]
>>> b = a
>>> b *= 2
>>> a is b
True
>>> b
[1, 2, 1, 2]
Since you have changed the list object itself, both a and b see the same
change. Naturally, since a and b are nothing but two different names for
the same object.
But tuples are immutable, which means you *cannot* change then in-place.
Since *= cannot change the tuple in-place, it has to create a new tuple
and assign it to the name on the left hand side:
>>> c = (1, 2)
>>> d = c
>>> c is d
True
>>> d *= 2
>>> d
(1, 2, 1, 2)
c remains a name for the first tuple, and d is now a name for the new,
expanded tuple:
>>> c
(1, 2)
>>> c is d
False
[...]
Just to precisely understand English words, because this is a foreign
language for me. As far as I understand, assignment means giving a value to
a variable which is the expression used by classical languages that have
variables (such as Pascal or Basic). Python has no variables, since even the
simpliest data is an object, but we still say assignment, because it is
comfortable.
In this sense, if I say, "assignment" is a subset of "binding", is it
correct?
I don't think so. They are definitely related, though, assignment in the
Pascal or C sense is *like* name binding in the Python or Java sense,
but they are not strictly subset/superset of each other.
If one was a subset of the other, then you could write down every fact
about name binding:
Name binding is:
1. blah blah blah...
2. ...
3. ...
999. ...
and then every fact about assignment:
Assignment is:
1. blah blah blah...
2. ...
3. ...
777. ...
and every fact about assignment would also be a fact about name binding.
But that's not the case.
--
Steven
_______________________________________________
Tutor maillist - Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor