J
John Posner
Alf said (2/13/2010 8:34 PM):
Alf also said (2/13/2010 8:43 PM):
Steve D'Aprano said (2/14/2010 12:13 AM):
I think most of the technical argument in this thread comes down to the
various forms of the word *refer*. After execution of this Python statement:
x = 5
.... we can use this English-language statement:
the name *x* refers to the value *5*
(If anyone has more than Steve's "mild" objection, please speak up!)
The English-language statement uses the VERB "refers". It is not the
same as using the NOUN "reference":
*x* is a reference to the value *5*
Why not? Because using the NOUN form suggests that you're talking about
a particular kind of object in the world Python, as in these statements:
*x* is a string
*x* is a function
*x* is a class
But Python does not define *reference* objects -- by which I mean that
executing *import types; dir(types)* produces a long list of object-type
names, and there's nothing like a "reference" on that list.
(I suspect there's a better way to make this "there are no reference
objects" argument. Can anyone help?)
Amending the statement to:
the name *x* is a reference to the value *5*
.... doesn't really help matters. Is *x* a NAME or is it a REFERENCE?
Looking again at Alf's assertion:
.... and Alf's example (message dated 2/10/2010 5:02 PM):
I believe Alf would characterize this assignment statement as a
situation in which "a reference is copied" [using the NOUN form of
"refer"]. But no object is copied during execution of this statement.
Moreover, saying "a reference is copied" might mislead a Python newbie
into thinking that some kind of "reference object" exists that can be
copied by Python statements. So it's better to describe the situation
using the VERB form of "refer":
assigns the name *x* to the object that *s[0]* refers to
-John
Names in Python refer to objects.
Those references can be copied via assignment.
That's (almost) all.
And it provides a very short and neat way to describe pass by sharing.
Alf also said (2/13/2010 8:43 PM):
* Steve Howell:
I think that regarding the technical it is whether a Python name
refers to an object or not. I maintain that it does, and that the
reference can be copied, and that the semantics of the language
requires this and is defined in terms of this. Steve Holden,
D'Aprano and many others maintain that there are no references, or
that if there are then they're only an implementation aspect, i.e.
that conceiveable one could have an implementation without them.
Steve D'Aprano said (2/14/2010 12:13 AM):
That's not to say that the general concept of references (as in "to
refer to") isn't valuable when discussing Python. If you want to say
that (e.g.) following
x = 1
the name "x" refers to (or even points to!) the object 1, my
objections will be mild or non-existent. In that sense, it's probably
impossible to program without some sort of "references": the computer
manipulates variables or objects directly, while we manipulate
characters in source code. The only way to write a program is to use
some abstract thing (a name, an offset, whatever) that refers, in
some fashion, to a collection of bits in the computer's memory. But
to go from that to the idea that (say) x is a pointer does so much
violence to the concept of pointer and has so much room for confusion
that it is actively harmful.
I think most of the technical argument in this thread comes down to the
various forms of the word *refer*. After execution of this Python statement:
x = 5
.... we can use this English-language statement:
the name *x* refers to the value *5*
(If anyone has more than Steve's "mild" objection, please speak up!)
The English-language statement uses the VERB "refers". It is not the
same as using the NOUN "reference":
*x* is a reference to the value *5*
Why not? Because using the NOUN form suggests that you're talking about
a particular kind of object in the world Python, as in these statements:
*x* is a string
*x* is a function
*x* is a class
But Python does not define *reference* objects -- by which I mean that
executing *import types; dir(types)* produces a long list of object-type
names, and there's nothing like a "reference" on that list.
(I suspect there's a better way to make this "there are no reference
objects" argument. Can anyone help?)
Amending the statement to:
the name *x* is a reference to the value *5*
.... doesn't really help matters. Is *x* a NAME or is it a REFERENCE?
Looking again at Alf's assertion:
[the core technical question is] whether a Python name
refers to an object or not. I maintain that it does, and that the
reference can be copied,
.... and Alf's example (message dated 2/10/2010 5:02 PM):
For example,
x = s[0]
accesses the object that s points (refers) to.
I believe Alf would characterize this assignment statement as a
situation in which "a reference is copied" [using the NOUN form of
"refer"]. But no object is copied during execution of this statement.
Moreover, saying "a reference is copied" might mislead a Python newbie
into thinking that some kind of "reference object" exists that can be
copied by Python statements. So it's better to describe the situation
using the VERB form of "refer":
assigns the name *x* to the object that *s[0]* refers to
-John