On 2/15/2010 6:09 PM, Steven D'Aprano wrote:
On Mon, 15 Feb 2010 21:25:23 +0000, Arnaud Delobelle wrote:

John Posner<jjpos...@optimum.net>  writes: [...]
   x = s[0]
[...]
   assigns the name *x* to the object that *s[0]* refers to

s[0] does not refer to an object, it *is* an object (once evaluated of
course, otherwise it's just a Python expression).

Precisely. Treated as an expression, that is, as a string being evaluated
by the compiler, we would say that it *refers to* an object (unless
evaluation fails, in which case it refers to nothing at all). But treated
as whatever you get after the compiler is done with it, that is, post-
evaluation, we would say that it *is* an object.

This subtle distinction is essentially the difference between a label and
the thing that is labeled.

Is this your only quibble with my writeup? If, so, I'm gratified. And your objections make perfect sense. Still, I'll attempt to justify my phrasing. I was originally going to write:

  assigns the name *x* to the object that THE NAME *s[0]* refers to

... but I didn't want to start a distracting argument on the use of the phrase *the name* to describe the 4-char string *s[0]*. So now I'll try to (briefly) make my case.

Yes, it might be more correct to say that *s[0]* is an expression (equivalent to the more obvious expression *s.__getitem__(0)*). But in common usage, the 4-char string *s[0]* _behaves_ like a name. If you accept this viewpoint, the story on Python assignment statements becomes quite simple ...

Syntactic sugar aside, there are only two kinds of assignment statements:

1. NAME = EXPRESSION

The EXPRESSION creates a new object, and the NAME is assigned to that object. Examples:

 x = x + 1
 obj = MyClass(1, 2, "red")
 mywordlist = mysentence.split()

2. NAME2 = NAME1

No new object is created. NAME2 becomes another name (an "alias") for the existing object that currently has NAME1 assigned to it. Examples:

 y = x
 s[0] = s[42]
 mydict["spamwich"] == this_sandwich
 obj.color = MYCOLORS.LTGREEN

This viewpoint might fail in advanced areas of Python programming: properties/descriptors, double-underscore methods, etc. But in my own day-to-day usage (admittedly, I'm a hobbyist Python programmer, not a professional), it's never failed me to think this way:

 * A dict is a collection of user-devised names, each of which
   is assigned to an object.
 * A list/tuple is an interpreter-maintained collection of integer
   names (0, 1, 2, ...), each of which is assigned to an object.
 * A class instance is very much like a dict.

Tx,
John
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to